15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Portions are Copyright (C) 1998 Netscape Communications Corporation.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Other contributors:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Robert O'Callahan <roc+@cs.cmu.edu>
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   David Baron <dbaron@fas.harvard.edu>
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Christian Biesinger <cbiesinger@web.de>
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Randall Jesup <rjesup@wgate.com>
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Josh Soref <timeless@mac.com>
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *   Boris Zbarsky <bzbarsky@mit.edu>
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Lesser General Public
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2.1 of the License, or (at your option) any later version.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Lesser General Public License for more details.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Lesser General Public
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License along with this library; if not, write to the Free Software
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Alternatively, the contents of this file may be used under the terms
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * of either the Mozilla Public License Version 1.1, found at
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (the "GPL"), in which case the provisions of the MPL or the GPL are
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * applicable instead of those above.  If you wish to allow use of your
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file only under the terms of one of those two
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * licenses (the MPL or the GPL) and not to allow others to use your
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under the LGPL, indicate your decision by
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * deletingthe provisions above and replace them with the notice and
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * other provisions required by the MPL or the GPL, as the case may be.
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * If you do not delete the provisions above, a recipient may use your
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version of this file under any of the LGPL, the MPL or the GPL.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h"
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/css/PseudoStyleRequest.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
51e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/DeprecatedScheduleStyleRecalcDuringLayout.h"
531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h"
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/HTMLFrameElement.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/ColumnInfo.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/FilterEffectRenderer.h"
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestRequest.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestingTransformState.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFlowThread.h"
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderGeometryMap.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderInline.h"
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/rendering/RenderPart.h"
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderReplica.h"
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbar.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderScrollbarPart.h"
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTreeAsText.h"
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/svg/ReferenceFilterBuilder.h"
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/svg/RenderSVGResourceClipper.h"
77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/LengthFunctions.h"
781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Partitions.h"
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatPoint3D.h"
821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/geometry/TransformState.h"
84a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextStateSaver.h"
85a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/ReferenceFilter.h"
86a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/SourceGraphic.h"
87f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/transforms/ScaleTransformOperation.h"
881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/transforms/TransformationMatrix.h"
89f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/transforms/TranslateTransformOperation.h"
90f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "public/platform/Platform.h"
9102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/StdLibExtras.h"
9202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/text/CString.h"
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)namespace {
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static CompositingQueryMode gCompositingQueryMode =
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases;
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} // namespace
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)RenderLayer::RenderLayer(RenderLayerModelObject* renderer, LayerType type)
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_layerType(type)
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_hasSelfPaintingLayerDescendant(false)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasSelfPaintingLayerDescendantDirty(false)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isRootLayer(renderer->isRenderView())
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_usedTransparency(false)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_visibleContentStatusDirty(true)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasVisibleContent(false)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_visibleDescendantStatusDirty(false)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasVisibleDescendant(false)
115f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_hasVisibleNonLayerContent(false)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isPaginated(false)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_3DTransformedDescendantStatusDirty(true)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_has3DTransformedDescendant(false)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_containsDirtyOverlayScrollbars(false)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasFilterInfo(false)
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    , m_needsAncestorDependentCompositingInputsUpdate(true)
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    , m_needsDescendantDependentCompositingInputsUpdate(true)
1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    , m_childNeedsCompositingInputsUpdate(true)
12410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_hasCompositingDescendant(false)
12510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_hasNonCompositedChild(false)
12610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_shouldIsolateCompositedDescendants(false)
12710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_lostGroupedMapping(false)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_renderer(renderer)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_parent(0)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_previous(0)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_next(0)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_first(0)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_last(0)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_staticInlinePosition(0)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_staticBlockPosition(0)
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_enclosingPaginationLayer(0)
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    , m_potentialCompositingReasonsFromStyle(CompositingReasonNone)
13810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    , m_compositingReasons(CompositingReasonNone)
13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_groupedMapping(0)
140f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_clipper(*renderer)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
142bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    updateStackingNode();
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!renderer->slowFirstChild() && renderer->style()) {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_visibleContentStatusDirty = false;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasVisibleContent = renderer->style()->visibility() == VISIBLE;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    updateScrollableArea();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer::~RenderLayer()
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
156fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (renderer()->frame() && renderer()->frame()->page()) {
157fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->page()->scrollingCoordinator())
158e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            scrollingCoordinator->willDestroyRenderLayer(this);
159fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    }
160fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeFilterInfoIfNeeded();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (groupedMapping()) {
16443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        DisableCompositingQueryAsserts disabler;
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        groupedMapping()->removeRenderLayerFromSquashingGraphicsLayer(this);
16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setGroupedMapping(0);
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Child layers will be deleted by their corresponding render objects, so
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we don't need to delete them ourselves.
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    clearCompositedLayerMapping(true);
173e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
174e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_reflectionInfo)
175e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_reflectionInfo->destroy();
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String RenderLayer::debugName() const
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isReflection()) {
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return renderer()->parent()->debugName() + " (reflection)";
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
183f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return renderer()->debugName();
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayerCompositor* RenderLayer::compositor() const
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderer()->view())
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return renderer()->view()->compositor();
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::contentChanged(ContentChangeType changeType)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // updateLayerCompositingState will query compositingReasons for accelerated overflow scrolling.
19607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // This is tripped by LayoutTests/compositing/content-changed-chicken-egg.html
19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    DisableCompositingQueryAsserts disabler;
19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (changeType == CanvasChanged)
200f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInputChange);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (changeType == CanvasContextChanged) {
203323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInputChange);
204323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
205323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // Although we're missing test coverage, we need to call
206323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // GraphicsLayer::setContentsToPlatformLayer with the new platform
207323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // layer for this canvas.
208323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // See http://crbug.com/349195
209323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (hasCompositedLayerMapping())
21076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree);
211323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_compositedLayerMapping)
2141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_compositedLayerMapping->contentChanged(changeType);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::paintsWithFilters() const
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()->hasFilter())
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // https://code.google.com/p/chromium/issues/detail?id=343759
22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    DisableCompositingQueryAsserts disabler;
224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return !m_compositedLayerMapping || compositingState() != PaintsIntoOwnBacking;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochLayoutSize RenderLayer::subpixelAccumulation() const
228a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
229a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return m_subpixelAccumulation;
230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
231a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
232a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid RenderLayer::setSubpixelAccumulation(const LayoutSize& size)
233a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
234a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_subpixelAccumulation = size;
235a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
236a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderLayer::updateLayerPositionsAfterLayout()
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    TRACE_EVENT0("blink", "RenderLayer::updateLayerPositionsAfterLayout");
24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
241197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_clipper.clearClipRectsIncludingDescendants();
242c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    updateLayerPositionRecursive();
243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
244c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // FIXME: Remove incremental compositing updates after fixing the chicken/egg issues
246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // https://code.google.com/p/chromium/issues/detail?id=343756
247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        DisableCompositingQueryAsserts disabler;
248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        bool needsPaginationUpdate = isPaginated() || enclosingPaginationLayer();
249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        updatePaginationRecursive(needsPaginationUpdate);
250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderLayer::updateLayerPositionRecursive()
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
255f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_reflectionInfo)
256f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_reflectionInfo->reflection()->layout();
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // FIXME: We should be able to remove this call because we don't care about
259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // any descendant-dependent flags, but code somewhere else is reading these
260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // flags and depending on us to update them.
261c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    updateDescendantDependentFlags();
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child->updateLayerPositionRecursive();
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderLayer::updateHasSelfPaintingLayerDescendant() const
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
269e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(m_hasSelfPaintingLayerDescendantDirty);
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_hasSelfPaintingLayerDescendant = false;
272e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
273e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) {
275e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            m_hasSelfPaintingLayerDescendant = true;
276e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            break;
277e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
279e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
280e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_hasSelfPaintingLayerDescendantDirty = false;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus()
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* layer = this; layer; layer = layer->parent()) {
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layer->m_hasSelfPaintingLayerDescendantDirty = true;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we have reached a self-painting layer, we know our parent should have a self-painting descendant
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // in this case, there is no need to dirty our ancestors further.
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer->isSelfPaintingLayer()) {
290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->m_hasSelfPaintingLayerDescendant);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
296197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool RenderLayer::scrollsWithViewport() const
297c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
298e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return renderer()->style()->position() == FixedPosition && renderer()->containerForFixedPosition() == renderer()->view();
299c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
300c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
301197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool RenderLayer::scrollsWithRespectTo(const RenderLayer* other) const
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (scrollsWithViewport() != other->scrollsWithViewport())
304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return true;
305197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return ancestorScrollingLayer() != other->ancestorScrollingLayer();
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
30876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void RenderLayer::updateTransformationMatrix()
30976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
31076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_transform) {
31176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        RenderBox* box = renderBox();
31276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        ASSERT(box);
31376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_transform->makeIdentity();
31476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        box->style()->applyTransform(*m_transform, box->pixelSnappedBorderBoxRect().size(), RenderStyle::IncludeTransformOrigin);
31576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositing());
31676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    }
31776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
31876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
31976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void RenderLayer::updateTransform(const RenderStyle* oldStyle, RenderStyle* newStyle)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (oldStyle && newStyle->transformDataEquivalent(*oldStyle))
32276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return;
32376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // hasTransform() on the renderer is also true when there is transform-style: preserve-3d or perspective set,
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so check style too.
32676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    bool hasTransform = renderer()->hasTransform() && newStyle->hasTransform();
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool had3DTransform = has3DTransform();
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hadTransform = m_transform;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasTransform != hadTransform) {
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hasTransform)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_transform = adoptPtr(new TransformationMatrix);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_transform.clear();
33502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Layers with transforms act as clip rects roots, so clear the cached clip rects here.
337bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_clipper.clearClipRectsIncludingDescendants();
33876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    } else if (hasTransform) {
33976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_clipper.clearClipRectsIncludingDescendants(AbsoluteClipRects);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
34102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
34276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    updateTransformationMatrix();
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (had3DTransform != has3DTransform())
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dirty3DTransformedDescendantStatus();
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic RenderLayer* enclosingLayerForContainingBlock(RenderLayer* layer)
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
35007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (RenderObject* containingBlock = layer->renderer()->containingBlock())
35107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return containingBlock->enclosingLayer();
35207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
35307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochRenderLayer* RenderLayer::renderingContextRoot()
35607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
35707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RenderLayer* renderingContext = 0;
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (shouldPreserve3D())
36007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        renderingContext = this;
36107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (RenderLayer* current = enclosingLayerForContainingBlock(this); current && current->shouldPreserve3D(); current = enclosingLayerForContainingBlock(current))
36307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        renderingContext = current;
36407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
36507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return renderingContext;
36609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TransformationMatrix RenderLayer::currentTransform(RenderStyle::ApplyTransformOrigin applyOrigin) const
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_transform)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TransformationMatrix();
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // m_transform includes transform-origin, so we need to recompute the transform here.
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (applyOrigin == RenderStyle::ExcludeTransformOrigin) {
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderBox* box = renderBox();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransformationMatrix currTransform;
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        box->style()->applyTransform(currTransform, box->pixelSnappedBorderBoxRect().size(), RenderStyle::ExcludeTransformOrigin);
378323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        makeMatrixRenderable(currTransform, compositor()->hasAcceleratedCompositing());
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return currTransform;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *m_transform;
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TransformationMatrix RenderLayer::renderableTransform(PaintBehavior paintBehavior) const
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_transform)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TransformationMatrix();
38902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (paintBehavior & PaintBehaviorFlattenCompositingLayers) {
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransformationMatrix matrix = *m_transform;
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        makeMatrixRenderable(matrix, false /* flatten 3d */);
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return matrix;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *m_transform;
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)RenderLayer* RenderLayer::enclosingOverflowClipLayer(IncludeSelfOrNot includeSelf) const
40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const RenderLayer* layer = (includeSelf == IncludeSelf) ? this : parent();
40209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    while (layer) {
40309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (layer->renderer()->hasOverflowClip())
40409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return const_cast<RenderLayer*>(layer);
40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        layer = layer->parent();
40709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
40809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return 0;
40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool checkContainingBlockChainForPagination(RenderLayerModelObject* renderer, RenderBox* ancestorColumnsRenderer)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* view = renderer->view();
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayerModelObject* prevBlock = renderer;
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlock* containingBlock;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (containingBlock = renderer->containingBlock();
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         containingBlock && containingBlock != view && containingBlock != ancestorColumnsRenderer;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         containingBlock = containingBlock->containingBlock())
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        prevBlock = containingBlock;
42002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the columns block wasn't in our containing block chain, then we aren't paginated by it.
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (containingBlock != ancestorColumnsRenderer)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
42402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the previous block is absolutely positioned, then we can't be paginated by the columns block.
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (prevBlock->isOutOfFlowPositioned())
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
42802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise we are paginated by the columns block.
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::useRegionBasedColumns() const
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
43509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return renderer()->document().regionBasedColumnsEnabled();
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
438c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderLayer::updatePaginationRecursive(bool needsPaginationUpdate)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isPaginated = false;
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_enclosingPaginationLayer = 0;
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
443c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (useRegionBasedColumns() && renderer()->isRenderFlowThread())
444c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        needsPaginationUpdate = true;
445c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
446c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (needsPaginationUpdate)
447c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        updatePagination();
448c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
449c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (renderer()->hasColumns())
450c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        needsPaginationUpdate = true;
451c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
452c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
453c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child->updatePaginationRecursive(needsPaginationUpdate);
454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
456c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderLayer::updatePagination()
457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (compositingState() != NotComposited || !parent())
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return; // FIXME: We will have to deal with paginated compositing layers someday.
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // FIXME: For now the RenderView can't be paginated.  Eventually printing will move to a model where it is though.
461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The main difference between the paginated booleans for the old column code and the new column code
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // is that each paginated layer has to paint on its own with the new code. There is no
464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // recurring into child layers. This means that the m_isPaginated bits for the new column code can't just be set on
465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // "roots" that get split and paint all their descendants. Instead each layer has to be checked individually and
466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // genuinely know if it is going to have to split itself up when painting only its contents (and not any other descendant
467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // layers). We track an enclosingPaginationLayer instead of using a simple bit, since we want to be able to get back
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // to that layer easily.
469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool regionBasedColumnsUsed = useRegionBasedColumns();
470d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (regionBasedColumnsUsed && renderer()->isRenderFlowThread()) {
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_enclosingPaginationLayer = this;
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
475bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_stackingNode->isNormalFlowOnly()) {
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (regionBasedColumnsUsed) {
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Content inside a transform is not considered to be paginated, since we simply
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // paint the transform multiple times in each column, so we don't have to use
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // fragments for the transformed content.
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_enclosingPaginationLayer = parent()->enclosingPaginationLayer();
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransform())
482926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                m_enclosingPaginationLayer = 0;
483c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else {
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            m_isPaginated = parent()->renderer()->hasColumns();
485c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
486926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // For the new columns code, we want to walk up our containing block chain looking for an enclosing layer. Once
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // we find one, then we just check its pagination status.
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (regionBasedColumnsUsed) {
492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderView* view = renderer()->view();
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderBlock* containingBlock;
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (containingBlock = renderer()->containingBlock();
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             containingBlock && containingBlock != view;
496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             containingBlock = containingBlock->containingBlock()) {
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (containingBlock->hasLayer()) {
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                // Content inside a transform is not considered to be paginated, since we simply
499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                // paint the transform multiple times in each column, so we don't have to use
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                // fragments for the transformed content.
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                m_enclosingPaginationLayer = containingBlock->layer()->enclosingPaginationLayer();
502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransform())
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    m_enclosingPaginationLayer = 0;
504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If we're not normal flow, then we need to look for a multi-column object between us and our stacking container.
511d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderLayerStackingNode* ancestorStackingContextNode = m_stackingNode->ancestorStackingContextNode();
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* curr = parent(); curr; curr = curr->parent()) {
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (curr->renderer()->hasColumns()) {
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_isPaginated = checkContainingBlockChainForPagination(renderer(), curr->renderBox());
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
517d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (curr->stackingNode() == ancestorStackingContextNode)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutPoint RenderLayer::positionFromPaintInvalidationBacking(const RenderObject* renderObject, const RenderLayerModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState)
5237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    FloatPoint point = renderObject->localToContainerPoint(FloatPoint(), paintInvalidationContainer, 0, 0, paintInvalidationState);
5257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Eventually we are going to unify coordinates in GraphicsLayer space.
5277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (paintInvalidationContainer && paintInvalidationContainer->layer()->groupedMapping())
5287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        mapPointToPaintBackingCoordinates(paintInvalidationContainer, point);
5297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return LayoutPoint(point);
5317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderLayer::mapPointToPaintBackingCoordinates(const RenderLayerModelObject* paintInvalidationContainer, FloatPoint& point)
534f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
5357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderLayer* paintInvalidationLayer = paintInvalidationContainer->layer();
5367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!paintInvalidationLayer->groupedMapping()) {
5377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        point.move(paintInvalidationLayer->compositedLayerMapping()->contentOffsetInCompositingLayer());
5387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
5397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
540f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderLayerModelObject* transformedAncestor = paintInvalidationLayer->enclosingTransformedAncestor()->renderer();
54276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (!transformedAncestor)
5437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
5447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the
5467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // transformed ancestor.
5477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    point = paintInvalidationContainer->localToContainerPoint(point, transformedAncestor);
54876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
5497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    point.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTransformedAncestor());
55076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
55176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
552197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::mapRectToPaintBackingCoordinates(const RenderLayerModelObject* paintInvalidationContainer, LayoutRect& rect)
55376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
554197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RenderLayer* paintInvalidationLayer = paintInvalidationContainer->layer();
555197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!paintInvalidationLayer->groupedMapping()) {
556197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        rect.move(paintInvalidationLayer->compositedLayerMapping()->contentOffsetInCompositingLayer());
55776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return;
55876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    }
55976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
560197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RenderLayerModelObject* transformedAncestor = paintInvalidationLayer->enclosingTransformedAncestor()->renderer();
561f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!transformedAncestor)
562f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return;
563f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |paintInvalidationContainer| may have a local 2D transform on it, so take that into account when mapping into the space of the
565197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // transformed ancestor.
566197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    rect = LayoutRect(paintInvalidationContainer->localToContainerQuad(FloatRect(rect), transformedAncestor).boundingBox());
567197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
568197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    rect.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTransformedAncestor());
569197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
570197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
571197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::mapRectToPaintInvalidationBacking(const RenderObject* renderObject, const RenderLayerModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState)
572197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
573197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!paintInvalidationContainer->layer()->groupedMapping()) {
5747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState);
575197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
576197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
577f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // This code adjusts the paint invalidation rectangle to be in the space of the transformed ancestor of the grouped (i.e. squashed)
5799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // layer. This is because all layers that squash together need to issue paint invalidations w.r.t. a single container that is
580f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // an ancestor of all of them, in order to properly take into account any local transforms etc.
5819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // FIXME: remove this special-case code that works around the paint invalidation code structure.
5827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    renderObject->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, paintInvalidationState);
583197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mapRectToPaintBackingCoordinates(paintInvalidationContainer, rect);
585f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
586f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
587197021e6b966cfb06891637935ef33fff06433d1Ben MurdochLayoutRect RenderLayer::computePaintInvalidationRect(const RenderObject* renderObject, const RenderLayer* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState)
588f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
589197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!paintInvalidationContainer->groupedMapping())
590197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return renderObject->computePaintInvalidationRect(paintInvalidationContainer->renderer(), paintInvalidationState);
5917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect rect = renderObject->clippedOverflowRectForPaintInvalidation(paintInvalidationContainer->renderer(), paintInvalidationState);
5937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mapRectToPaintBackingCoordinates(paintInvalidationContainer->renderer(), rect);
594f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return rect;
595f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
596f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
59702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid RenderLayer::dirtyVisibleContentStatus()
59802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
59902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    m_visibleContentStatusDirty = true;
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent())
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parent()->dirtyAncestorChainVisibleDescendantStatus();
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
604e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderLayer::potentiallyDirtyVisibleContentStatus(EVisibility visibility)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
606e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_visibleContentStatusDirty)
607e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return;
608e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (hasVisibleContent() == (visibility == VISIBLE))
609e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return;
610e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    dirtyVisibleContentStatus();
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
613e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderLayer::dirtyAncestorChainVisibleDescendantStatus()
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* layer = this; layer; layer = layer->parent()) {
616e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (layer->m_visibleDescendantStatusDirty)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
619e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        layer->m_visibleDescendantStatusDirty = true;
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
623f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)// FIXME: this is quite brute-force. We could be more efficient if we were to
624a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// track state and update it as appropriate as changes are made in the Render tree.
625a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid RenderLayer::updateScrollingStateAfterCompositingChange()
626f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
627e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    TRACE_EVENT0("blink", "RenderLayer::updateScrollingStateAfterCompositingChange");
628f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_hasVisibleNonLayerContent = false;
629d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (RenderObject* r = renderer()->slowFirstChild(); r; r = r->nextSibling()) {
630f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (!r->hasLayer()) {
631f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_hasVisibleNonLayerContent = true;
632f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            break;
633f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        }
634f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
635a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
63610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_hasNonCompositedChild = false;
637a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
638e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (child->compositingState() == NotComposited || child->compositingState() == HasOwnBackingButPaintsIntoAncestor) {
63910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            m_hasNonCompositedChild = true;
640a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return;
641a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
642a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
643f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
644f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
645e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// The descendant-dependent flags system is badly broken because we clean dirty
646e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// bits in upward tree walks, which means we need to call updateDescendantDependentFlags
647e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// at every node in the tree to fully clean all the dirty bits. While we'll in
648e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// the process of fixing this issue, updateDescendantDependentFlagsForEntireSubtree
649e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// provides a big hammer for actually cleaning all the dirty bits in a subtree.
650e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)//
651e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// FIXME: Remove this function once the descendant-dependent flags system keeps
652e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// its dirty bits scoped to subtrees.
653e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderLayer::updateDescendantDependentFlagsForEntireSubtree()
654e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
655e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    updateDescendantDependentFlags();
656e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
657e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
658e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        child->updateDescendantDependentFlagsForEntireSubtree();
659e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
660e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
6615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void RenderLayer::updateDescendantDependentFlags()
6625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
663e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_visibleDescendantStatusDirty) {
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasVisibleDescendant = false;
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
6675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            child->updateDescendantDependentFlags();
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
669e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) {
670e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                m_hasVisibleDescendant = true;
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
672e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            }
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_visibleDescendantStatusDirty = false;
676bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
677bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_visibleContentStatusDirty) {
67907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        bool previouslyHasVisibleContent = m_hasVisibleContent;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (renderer()->style()->visibility() == VISIBLE)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_hasVisibleContent = true;
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // layer may be hidden but still have some visible content, check for this
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_hasVisibleContent = false;
685d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            RenderObject* r = renderer()->slowFirstChild();
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (r) {
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (r->style()->visibility() == VISIBLE && !r->hasLayer()) {
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_hasVisibleContent = true;
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
691d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                RenderObject* rendererFirstChild = r->slowFirstChild();
692d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                if (rendererFirstChild && !r->hasLayer())
693d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    r = rendererFirstChild;
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else if (r->nextSibling())
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    r = r->nextSibling();
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else {
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    do {
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        r = r->parent();
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (r == renderer())
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            r = 0;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    } while (r && !r->nextSibling());
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (r)
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        r = r->nextSibling();
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
7075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        m_visibleContentStatusDirty = false;
708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
709e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (hasVisibleContent() != previouslyHasVisibleContent) {
7105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            setNeedsCompositingInputsUpdate();
711e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            // We need to tell m_renderer to recheck its rect because we
712e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            // pretend that invisible RenderObjects have 0x0 rects. Changing
713e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            // visibility therefore changes our rect and we need to visit
714e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            // this RenderObject during the invalidateTreeIfNeeded walk.
715e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            m_renderer->setMayNeedPaintInvalidation(true);
716e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::dirty3DTransformedDescendantStatus()
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
722d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingContextNode();
723f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!stackingNode)
724f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
725f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
726f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
72702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This propagates up through preserve-3d hierarchies to the enclosing flattening layer.
729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Note that preserves3D() creates stacking context, so we can just run up the stacking containers.
730f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    while (stackingNode && stackingNode->layer()->preserves3D()) {
731f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
732d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        stackingNode = stackingNode->ancestorStackingContextNode();
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Return true if this layer or any preserve-3d descendants have 3d.
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::update3DTransformedDescendantStatus()
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_3DTransformedDescendantStatusDirty) {
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_has3DTransformedDescendant = false;
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
742bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_stackingNode->updateZOrderLists();
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Transformed or preserve-3d descendants can only be in the z-order lists, not
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // in the normal flow list, so we only need to check those.
746f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), PositiveZOrderChildren | NegativeZOrderChildren);
747f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        while (RenderLayerStackingNode* node = iterator.next())
748f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            m_has3DTransformedDescendant |= node->layer()->update3DTransformedDescendantStatus();
74902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_3DTransformedDescendantStatusDirty = false;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
75202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we live in a 3d hierarchy, then the layer at the root of that hierarchy needs
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the m_has3DTransformedDescendant set.
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (preserves3D())
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return has3DTransform() || m_has3DTransformedDescendant;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return has3DTransform();
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
761e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)IntSize RenderLayer::size() const
762e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
763e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (renderer()->isInline() && renderer()->isRenderInline())
764e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return toRenderInline(renderer())->linesBoundingBox().size();
765e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
766e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // FIXME: Is snapping the size really needed here?
767e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (RenderBox* box = renderBox())
768e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return pixelSnappedIntSize(box->size(), box->location());
769e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
770e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return IntSize();
771e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
772e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
773e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)LayoutPoint RenderLayer::location() const
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint localPoint;
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutSize inlineBoundingBoxOffset; // We don't put this into the RenderLayer x/y for inlines, so we need to subtract it out when done.
77707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()->isInline() && renderer()->isRenderInline()) {
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderInline* inlineFlow = toRenderInline(renderer());
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect lineBox = inlineFlow->linesBoundingBox();
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        inlineBoundingBoxOffset = toSize(lineBox.location());
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localPoint += inlineBoundingBoxOffset;
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (RenderBox* box = renderBox()) {
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localPoint += box->topLeftLocationOffset();
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()->isOutOfFlowPositioned() && renderer()->parent()) {
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We must adjust our position by walking up the render tree looking for the
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // nearest enclosing object with a layer.
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderObject* curr = renderer()->parent();
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (curr && !curr->hasLayer()) {
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (curr->isBox() && !curr->isTableRow()) {
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Rows and cells share the same coordinate space (that of the section).
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Omit them when computing our xpos/ypos.
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                localPoint += toRenderBox(curr)->topLeftLocationOffset();
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            curr = curr->parent();
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (curr->isBox() && curr->isTableRow()) {
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Put ourselves into the row coordinate space.
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            localPoint -= toRenderBox(curr)->topLeftLocationOffset();
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
80402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Subtract our parent's scroll offset.
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()->isOutOfFlowPositioned() && enclosingPositionedAncestor()) {
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* positionedParent = enclosingPositionedAncestor();
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For positioned layers, we subtract out the enclosing positioned layer's scroll offset.
810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (positionedParent->renderer()->hasOverflowClip()) {
811bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            LayoutSize offset = positionedParent->renderBox()->scrolledContentOffset();
812926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            localPoint -= offset;
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
81402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
815c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (positionedParent->renderer()->isRelPositioned() && positionedParent->renderer()->isRenderInline()) {
816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            LayoutSize offset = toRenderInline(positionedParent->renderer())->offsetForInFlowPositionedInline(*toRenderBox(renderer()));
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            localPoint += offset;
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (parent()) {
820197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME: This code is very wrong. The compositing system doesn't
821197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // understand columns and we're hacking around that fact by faking
822197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // the position of the RenderLayers when we think we'll end up being
823197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // composited. Hopefully we'll be able to unwind this hack when we
824197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // implement multi-column using regions.
825197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (hasStyleDeterminedDirectCompositingReasons()) {
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME: Composited layers ignore pagination, so about the best we can do is make sure they're offset into the appropriate column.
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // They won't split across columns properly.
8286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            if (!parent()->renderer()->hasColumns() && parent()->renderer()->isDocumentElement() && renderer()->view()->hasColumns())
829f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu                localPoint += renderer()->view()->columnOffset(localPoint);
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
831f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu                localPoint += parent()->renderer()->columnOffset(localPoint);
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (parent()->renderer()->hasOverflowClip()) {
835bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            IntSize scrollOffset = parent()->renderBox()->scrolledContentOffset();
836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            localPoint -= scrollOffset;
837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
83902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
840e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    localPoint.move(offsetForInFlowPosition());
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We'd really like to just get rid of the concept of a layer rectangle and rely on the renderers.
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    localPoint -= inlineBoundingBoxOffset;
84402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
845e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return localPoint;
846e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
847c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
848e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)const LayoutSize RenderLayer::offsetForInFlowPosition() const
849e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
850e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return renderer()->isRelPositioned() ? toRenderBoxModelObject(renderer())->offsetForInFlowPosition() : LayoutSize();
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TransformationMatrix RenderLayer::perspectiveTransform() const
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()->hasTransform())
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TransformationMatrix();
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* style = renderer()->style();
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!style->hasPerspective())
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TransformationMatrix();
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Maybe fetch the perspective from the backing?
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect();
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const float boxWidth = borderBox.width();
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const float boxHeight = borderBox.height();
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float perspectiveOriginX = floatValueForLength(style->perspectiveOriginX(), boxWidth);
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float perspectiveOriginY = floatValueForLength(style->perspectiveOriginY(), boxHeight);
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A perspective origin of 0,0 makes the vanishing point in the center of the element.
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We want it to be in the top-left, so subtract half the height and width.
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    perspectiveOriginX -= boxWidth / 2.0f;
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    perspectiveOriginY -= boxHeight / 2.0f;
87402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TransformationMatrix t;
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    t.translate(perspectiveOriginX, perspectiveOriginY);
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    t.applyPerspective(style->perspective());
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    t.translate(-perspectiveOriginX, -perspectiveOriginY);
87902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return t;
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint RenderLayer::perspectiveOrigin() const
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()->hasTransform())
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return FloatPoint();
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect();
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* style = renderer()->style();
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return FloatPoint(floatValueForLength(style->perspectiveOriginX(), borderBox.width().toFloat()), floatValueForLength(style->perspectiveOriginY(), borderBox.height().toFloat()));
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isFixedPositionedContainer(RenderLayer* layer)
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return layer->isRootLayer() || layer->hasTransform();
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::enclosingPositionedAncestor() const
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* curr = parent();
902bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    while (curr && !curr->isPositionedContainer())
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        curr = curr->parent();
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return curr;
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::enclosingTransformedAncestor() const
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* curr = parent();
9117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    while (curr && !curr->isRootLayer() && !curr->renderer()->hasTransform())
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        curr = curr->parent();
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return curr;
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
917f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuLayoutPoint RenderLayer::computeOffsetFromTransformedAncestor() const
918f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
919197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const AncestorDependentCompositingInputs& properties = ancestorDependentCompositingInputs();
920f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
921f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TransformState transformState(TransformState::ApplyTransformDirection, FloatPoint());
922f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME: add a test that checks flipped writing mode and ApplyContainerFlip are correct.
923f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    renderer()->mapLocalToContainer(properties.transformAncestor ? properties.transformAncestor->renderer() : 0, transformState, ApplyContainerFlip);
924f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    transformState.flatten();
925f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return LayoutPoint(transformState.lastPlanarPoint());
926f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
927f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
92809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const RenderLayer* RenderLayer::compositingContainer() const
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
930d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (stackingNode()->isNormalFlowOnly())
931d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return parent();
932d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (RenderLayerStackingNode* ancestorStackingNode = stackingNode()->ancestorStackingContextNode())
933d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return ancestorStackingNode->layer();
934d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return 0;
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
937197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool RenderLayer::isPaintInvalidationContainer() const
938d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
939d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return compositingState() == PaintsIntoOwnBacking || compositingState() == PaintsIntoGroupedBacking;
940d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
941d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
942197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Note: enclosingCompositingLayer does not include squashed layers. Compositing stacking children of squashed layers
943197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// receive graphics layers that are parented to the compositing ancestor of the squashed layer.
944197021e6b966cfb06891637935ef33fff06433d1Ben MurdochRenderLayer* RenderLayer::enclosingLayerWithCompositedLayerMapping(IncludeSelfOrNot includeSelf) const
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
94609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(isAllowedToQueryCompositingState());
94709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
94809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if ((includeSelf == IncludeSelf) && compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking)
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return const_cast<RenderLayer*>(this);
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (const RenderLayer* curr = compositingContainer(); curr; curr = curr->compositingContainer()) {
95209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (curr->compositingState() != NotComposited && curr->compositingState() != PaintsIntoGroupedBacking)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return const_cast<RenderLayer*>(curr);
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
95502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
959197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Return the enclosingCompositedLayerForPaintInvalidation for the given RenderLayer
960197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// including crossing frame boundaries.
961197021e6b966cfb06891637935ef33fff06433d1Ben MurdochRenderLayer* RenderLayer::enclosingLayerForPaintInvalidationCrossingFrameBoundaries() const
962197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
963197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const RenderLayer* layer = this;
964197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RenderLayer* compositedLayer = 0;
965197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    while (!compositedLayer) {
966197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        compositedLayer = layer->enclosingLayerForPaintInvalidation();
967197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!compositedLayer) {
968197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            RenderObject* owner = layer->renderer()->frame()->ownerRenderer();
969197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!owner)
970197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                break;
971197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            layer = owner->enclosingLayer();
972197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
973197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
974197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return compositedLayer;
975197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
976197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
977197021e6b966cfb06891637935ef33fff06433d1Ben MurdochRenderLayer* RenderLayer::enclosingLayerForPaintInvalidation() const
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
97909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(isAllowedToQueryCompositingState());
98009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
981197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (isPaintInvalidationContainer())
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return const_cast<RenderLayer*>(this);
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
984018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch    for (const RenderLayer* curr = compositingContainer(); curr; curr = curr->compositingContainer()) {
985197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (curr->isPaintInvalidationContainer())
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return const_cast<RenderLayer*>(curr);
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
98802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void RenderLayer::setNeedsCompositingInputsUpdate()
99307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
994197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_needsAncestorDependentCompositingInputsUpdate = true;
995197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_needsDescendantDependentCompositingInputsUpdate = true;
99607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (RenderLayer* current = this; current && !current->m_childNeedsCompositingInputsUpdate; current = current->parent())
9985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        current->m_childNeedsCompositingInputsUpdate = true;
999197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1000197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterCompositingInputChange);
100107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
100207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1003197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::updateAncestorDependentCompositingInputs(const AncestorDependentCompositingInputs& compositingInputs)
100407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
1005197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_ancestorDependentCompositingInputs = compositingInputs;
1006197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_needsAncestorDependentCompositingInputsUpdate = false;
100707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
100807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1009197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::updateDescendantDependentCompositingInputs(const DescendantDependentCompositingInputs& compositingInputs)
101007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
1011197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_descendantDependentCompositingInputs = compositingInputs;
1012197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_needsDescendantDependentCompositingInputsUpdate = false;
1013197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
1014197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1015197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::didUpdateCompositingInputs()
1016197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
1017197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(!needsCompositingInputsUpdate());
10185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    m_childNeedsCompositingInputsUpdate = false;
1019197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_scrollableArea)
1020197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_scrollableArea->updateNeedsCompositedScrolling();
102107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
102207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
102307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid RenderLayer::setCompositingReasons(CompositingReasons reasons, CompositingReasons mask)
1024d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
102510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if ((compositingReasons() & mask) == (reasons & mask))
1026d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
102710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_compositingReasons = (reasons & mask) | (compositingReasons() & ~mask);
1028d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1029d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
103076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void RenderLayer::setHasCompositingDescendant(bool hasCompositingDescendant)
103176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
103276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_hasCompositingDescendant == static_cast<unsigned>(hasCompositingDescendant))
103376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return;
103476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
103576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_hasCompositingDescendant = hasCompositingDescendant;
103676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
103776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (hasCompositedLayerMapping())
103876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLocal);
103976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
104076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
104176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void RenderLayer::setShouldIsolateCompositedDescendants(bool shouldIsolateCompositedDescendants)
104276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
104376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (m_shouldIsolateCompositedDescendants == static_cast<unsigned>(shouldIsolateCompositedDescendants))
104476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return;
104576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
104676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    m_shouldIsolateCompositedDescendants = shouldIsolateCompositedDescendants;
104776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
104876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    if (hasCompositedLayerMapping())
104976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLocal);
105076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
105176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hasAncestorWithFilterOutsets() const
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (const RenderLayer* curr = this; curr; curr = curr->parent()) {
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayerModelObject* renderer = curr->renderer();
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (renderer->style()->hasFilterOutsets())
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
106102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::transparentPaintingAncestor()
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
106451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (hasCompositedLayerMapping())
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* curr = parent(); curr; curr = curr->parent()) {
106851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (curr->hasCompositedLayerMapping())
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (curr->isTransparent())
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return curr;
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1076926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum TransparencyClipBoxBehavior {
1077926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PaintingTransparencyClipBox,
1078926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestingTransparencyClipBox
1079926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1081926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum TransparencyClipBoxMode {
1082926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DescendantsOfTransparencyClipBox,
1083926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RootOfTransparencyClipBox
1084926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
1085926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static LayoutRect transparencyClipBox(const RenderLayer*, const RenderLayer* rootLayer, TransparencyClipBoxBehavior, TransparencyClipBoxMode, const LayoutSize& subPixelAccumulation, PaintBehavior = 0);
1087926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1088926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static void expandClipRectForDescendantsAndReflection(LayoutRect& clipRect, const RenderLayer* layer, const RenderLayer* rootLayer,
1089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TransparencyClipBoxBehavior transparencyBehavior, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have a mask, then the clip is limited to the border box area (and there is
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // no need to examine child layers).
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!layer->renderer()->hasMask()) {
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Note: we don't have to walk z-order lists since transparent elements always establish
1095926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // a stacking container. This means we can just walk the layer tree directly.
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (RenderLayer* curr = layer->firstChild(); curr; curr = curr->nextSibling()) {
1097f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            if (!layer->reflectionInfo() || layer->reflectionInfo()->reflectionLayer() != curr)
1098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                clipRect.unite(transparencyClipBox(curr, rootLayer, transparencyBehavior, DescendantsOfTransparencyClipBox, subPixelAccumulation, paintBehavior));
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have a reflection, then we need to account for that when we push the clip.  Reflect our entire
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // current transparencyClipBox to catch all child layers.
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Accelerated compositing will eventually want to do something smart here to avoid incorporating this
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // size into the parent layer.
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (layer->renderer()->hasReflection()) {
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutPoint delta;
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        layer->convertToLayerCoords(rootLayer, delta);
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect.move(-delta.x(), -delta.y());
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect.unite(layer->renderBox()->reflectedRect(clipRect));
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clipRect.moveBy(delta);
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static LayoutRect transparencyClipBox(const RenderLayer* layer, const RenderLayer* rootLayer, TransparencyClipBoxBehavior transparencyBehavior,
1116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TransparencyClipBoxMode transparencyMode, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Although this function completely ignores CSS-imposed clipping, we did already intersect with the
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paintDirtyRect, and that should cut down on the amount we have to paint.  Still it
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // would be better to respect clips.
112102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (rootLayer != layer && ((transparencyBehavior == PaintingTransparencyClipBox && layer->paintsWithTransform(paintBehavior))
1123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || (transparencyBehavior == HitTestingTransparencyClipBox && layer->hasTransform()))) {
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The best we can do here is to use enclosed bounding boxes to establish a "fuzzy" enough clip to encompass
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the transformed layer and all of its children.
1126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const RenderLayer* paginationLayer = transparencyMode == DescendantsOfTransparencyClipBox ? layer->enclosingPaginationLayer() : 0;
1127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const RenderLayer* rootLayerForTransform = paginationLayer ? paginationLayer : rootLayer;
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutPoint delta;
1129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layer->convertToLayerCoords(rootLayerForTransform, delta);
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        delta.move(subPixelAccumulation);
1132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        IntPoint pixelSnappedDelta = roundedIntPoint(delta);
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransformationMatrix transform;
1134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        transform.translate(pixelSnappedDelta.x(), pixelSnappedDelta.y());
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transform = transform * *layer->transform();
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // We don't use fragment boxes when collecting a transformed layer's bounding box, since it always
1138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // paints unfragmented.
1139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        LayoutRect clipRect = layer->physicalBoundingBox(layer);
1140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        expandClipRectForDescendantsAndReflection(clipRect, layer, layer, transparencyBehavior, subPixelAccumulation, paintBehavior);
1141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        layer->renderer()->style()->filterOutsets().expandRect(clipRect);
1142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutRect result = transform.mapRect(clipRect);
1143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!paginationLayer)
1144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return result;
114502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // We have to break up the transformed extent across our columns.
1147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Split our box up into the actual fragment boxes that render in the columns/pages and unite those together to
1148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // get our true bounding box.
1149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderFlowThread* enclosingFlowThread = toRenderFlowThread(paginationLayer->renderer());
1150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result = enclosingFlowThread->fragmentsBoundingBox(result);
115102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutPoint rootLayerDelta;
1153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paginationLayer->convertToLayerCoords(rootLayer, rootLayerDelta);
1154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result.moveBy(rootLayerDelta);
1155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return result;
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
115702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1158a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutRect clipRect = layer->physicalBoundingBox(rootLayer);
1159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    expandClipRectForDescendantsAndReflection(clipRect, layer, rootLayer, transparencyBehavior, subPixelAccumulation, paintBehavior);
1160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    layer->renderer()->style()->filterOutsets().expandRect(clipRect);
1161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    clipRect.move(subPixelAccumulation);
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return clipRect;
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)LayoutRect RenderLayer::paintingExtent(const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return intersection(transparencyClipBox(this, rootLayer, PaintingTransparencyClipBox, RootOfTransparencyClipBox, subPixelAccumulation, paintBehavior), paintDirtyRect);
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void RenderLayer::beginTransparencyLayers(GraphicsContext* context, const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1172e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool createTransparencyLayerForBlendMode = m_stackingNode->isStackingContext() && hasDescendantWithBlendMode();
1173e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if ((paintsWithTransparency(paintBehavior) || paintsWithBlendMode() || createTransparencyLayerForBlendMode) && m_usedTransparency)
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
117502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* ancestor = transparentPaintingAncestor();
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ancestor)
1178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ancestor->beginTransparencyLayers(context, rootLayer, paintDirtyRect, subPixelAccumulation, paintBehavior);
117902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
118019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (paintsWithTransparency(paintBehavior) || paintsWithBlendMode() || createTransparencyLayerForBlendMode) {
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_usedTransparency = true;
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context->save();
1183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        LayoutRect clipRect = paintingExtent(rootLayer, paintDirtyRect, subPixelAccumulation, paintBehavior);
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context->clip(clipRect);
118509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
118619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (paintsWithBlendMode())
1187e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            context->setCompositeOperation(context->compositeOperation(), m_renderer->style()->blendMode());
1188bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context->beginTransparencyLayer(renderer()->opacity());
119009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
119109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (paintsWithBlendMode())
1192e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            context->setCompositeOperation(context->compositeOperation(), WebBlendModeNormal);
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef REVEAL_TRANSPARENCY_LAYERS
11945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        context->setFillColor(Color(0.0f, 0.0f, 0.5f, 0.2f));
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context->fillRect(clipRect);
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1200f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void* RenderLayer::operator new(size_t sz)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1202f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return partitionAlloc(Partitions::getRenderingPartition(), sz);
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void RenderLayer::operator delete(void* ptr)
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1207f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    partitionFree(ptr);
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::addChild(RenderLayer* child, RenderLayer* beforeChild)
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* prevSibling = beforeChild ? beforeChild->previousSibling() : lastChild();
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (prevSibling) {
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child->setPreviousSibling(prevSibling);
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        prevSibling->setNextSibling(child);
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(prevSibling != child);
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setFirstChild(child);
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (beforeChild) {
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        beforeChild->setPreviousSibling(child);
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child->setNextSibling(beforeChild);
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(beforeChild != child);
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setLastChild(child);
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1227323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    child->m_parent = this;
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setNeedsCompositingInputsUpdate();
1230197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1231bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (child->stackingNode()->isNormalFlowOnly())
1232bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_stackingNode->dirtyNormalFlowList();
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1234bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!child->stackingNode()->isNormalFlowOnly() || child->firstChild()) {
1235d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Dirty the z-order list in which we are contained. The ancestorStackingContextNode() can be null in the
1236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // case where we're building up generated content layers. This is ok, since the lists will start
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // off dirty in that case anyway.
1238d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        child->stackingNode()->dirtyStackingContextZOrderLists();
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    dirtyAncestorChainVisibleDescendantStatus();
1242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1244e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    child->updateDescendantDependentFlags();
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild)
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldChild->previousSibling())
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        oldChild->previousSibling()->setNextSibling(oldChild->nextSibling());
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldChild->nextSibling())
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling());
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_first == oldChild)
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_first = oldChild->nextSibling();
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_last == oldChild)
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_last = oldChild->previousSibling();
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1259bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (oldChild->stackingNode()->isNormalFlowOnly())
1260bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_stackingNode->dirtyNormalFlowList();
1261bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!oldChild->stackingNode()->isNormalFlowOnly() || oldChild->firstChild()) {
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Dirty the z-order list in which we are contained.  When called via the
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // reattachment process in removeOnlyThisLayer, the layer may already be disconnected
1264d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // from the main layer tree, so we need to null-check the
1265d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // |stackingContext| value.
1266d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        oldChild->stackingNode()->dirtyStackingContextZOrderLists();
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1269d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (renderer()->style()->visibility() != VISIBLE)
1270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        dirtyVisibleContentStatus();
1271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    oldChild->setPreviousSibling(0);
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    oldChild->setNextSibling(0);
1274323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    oldChild->m_parent = 0;
127553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1276e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1277e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    oldChild->updateDescendantDependentFlags();
12795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dirtyAncestorChainVisibleDescendantStatus();
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return oldChild;
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::removeOnlyThisLayer()
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_parent)
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1291bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_clipper.clearClipRectsIncludingDescendants();
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* nextSib = nextSibling();
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove the child reflection layer before moving other child layers.
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The reflection layer should not be moved to the parent.
1297f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_reflectionInfo)
1298f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        removeChild(m_reflectionInfo->reflectionLayer());
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now walk our kids and reattach them to our parent.
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* current = m_first;
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (current) {
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* next = current->nextSibling();
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeChild(current);
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_parent->addChild(current, nextSib);
130607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // FIXME: We should call a specialized version of this function.
1308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        current->updateLayerPositionsAfterLayout();
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        current = next;
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove us from the parent.
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parent->removeChild(this);
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_renderer->destroyLayer();
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::insertOnlyThisLayer()
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_parent && renderer()->parent()) {
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We need to connect ourselves when our renderer() has a parent.
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Find our enclosingLayer and add ourselves.
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* parentLayer = renderer()->parent()->enclosingLayer();
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(parentLayer);
1324f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        RenderLayer* beforeChild = !parentLayer->reflectionInfo() || parentLayer->reflectionInfo()->reflectionLayer() != this ? renderer()->parent()->findNextLayer(parentLayer, renderer()) : 0;
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentLayer->addChild(this, beforeChild);
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove all descendant layers from the hierarchy and add them to the new position.
1329d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (RenderObject* curr = renderer()->slowFirstChild(); curr; curr = curr->nextSibling())
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        curr->moveLayers(m_parent, this);
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clear out all the clip rects.
1333bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_clipper.clearClipRectsIncludingDescendants();
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Returns the layer reached on the walk up towards the ancestor.
1337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline const RenderLayer* accumulateOffsetTowardsAncestor(const RenderLayer* layer, const RenderLayer* ancestorLayer, LayoutPoint& location)
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(ancestorLayer != layer);
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const RenderLayerModelObject* renderer = layer->renderer();
1342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EPosition position = renderer->style()->position();
1343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: Special casing RenderFlowThread so much for fixed positioning here is not great.
1345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderFlowThread* fixedFlowThreadContainer = position == FixedPosition ? renderer->flowThreadContainingBlock() : 0;
1346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (fixedFlowThreadContainer && !fixedFlowThreadContainer->isOutOfFlowPositioned())
1347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fixedFlowThreadContainer = 0;
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Positioning of out-of-flow(fixed, absolute) elements collected in a RenderFlowThread
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // may need to be revisited in a future patch.
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the fixed renderer is inside a RenderFlowThread, we should not compute location using localToAbsolute,
135209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // since localToAbsolute maps the coordinates from flow thread to regions coordinates and regions can be
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // positioned in a completely different place in the viewport (RenderView).
1354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (position == FixedPosition && !fixedFlowThreadContainer && (!ancestorLayer || ancestorLayer == renderer->view()->layer())) {
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the fixed layer's container is the root, just add in the offset of the view. We can obtain this by calling
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // localToAbsolute() on the RenderView.
1357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        FloatPoint absPos = renderer->localToAbsolute(FloatPoint(), IsFixed);
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        location += LayoutSize(absPos.x(), absPos.y());
1359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return ancestorLayer;
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For the fixed positioned elements inside a render flow thread, we should also skip the code path below
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise, for the case of ancestorLayer == rootLayer and fixed positioned element child of a transformed
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // element in render flow thread, we will hit the fixed positioned container before hitting the ancestor layer.
1365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (position == FixedPosition && !fixedFlowThreadContainer) {
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For a fixed layers, we need to walk up to the root to see if there's a fixed position container
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // (e.g. a transformed layer). It's an error to call convertToLayerCoords() across a layer with a transform,
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // so we should always find the ancestor at or before we find the fixed position container.
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* fixedPositionContainerLayer = 0;
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool foundAncestor = false;
1371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (RenderLayer* currLayer = layer->parent(); currLayer; currLayer = currLayer->parent()) {
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (currLayer == ancestorLayer)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                foundAncestor = true;
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (isFixedPositionedContainer(currLayer)) {
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fixedPositionContainerLayer = currLayer;
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT_UNUSED(foundAncestor, foundAncestor);
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
138102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(fixedPositionContainerLayer); // We should have hit the RenderView's layer at least.
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (fixedPositionContainerLayer != ancestorLayer) {
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutPoint fixedContainerCoords;
1386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            layer->convertToLayerCoords(fixedPositionContainerLayer, fixedContainerCoords);
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutPoint ancestorCoords;
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ancestorLayer->convertToLayerCoords(fixedPositionContainerLayer, ancestorCoords);
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            location += (fixedContainerCoords - ancestorCoords);
1392591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        } else {
1393591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            location += toSize(layer->location());
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1395591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return ancestorLayer;
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
139702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* parentLayer;
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (position == AbsolutePosition || position == FixedPosition) {
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Do what enclosingPositionedAncestor() does, but check for ancestorLayer along the way.
1401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parentLayer = layer->parent();
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool foundAncestorFirst = false;
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (parentLayer) {
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // RenderFlowThread is a positioned container, child of RenderView, positioned at (0,0).
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // This implies that, for out-of-flow positioned elements inside a RenderFlowThread,
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // we are bailing out before reaching root layer.
1407bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            if (parentLayer->isPositionedContainer())
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (parentLayer == ancestorLayer) {
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                foundAncestorFirst = true;
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            parentLayer = parentLayer->parent();
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We should not reach RenderView layer past the RenderFlowThread layer for any
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // children of the RenderFlowThread.
1420d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        ASSERT(!renderer->flowThreadContainingBlock() || parentLayer != renderer->view()->layer());
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (foundAncestorFirst) {
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Found ancestorLayer before the abs. positioned container, so compute offset of both relative
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // to enclosingPositionedAncestor and subtract.
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderLayer* positionedAncestor = parentLayer->enclosingPositionedAncestor();
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutPoint thisCoords;
1428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            layer->convertToLayerCoords(positionedAncestor, thisCoords);
142902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            LayoutPoint ancestorCoords;
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ancestorLayer->convertToLayerCoords(positionedAncestor, ancestorCoords);
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            location += (thisCoords - ancestorCoords);
1434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return ancestorLayer;
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
1437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parentLayer = layer->parent();
143802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parentLayer)
1440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    location += toSize(layer->location());
1443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return parentLayer;
1444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutPoint& location) const
1447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ancestorLayer == this)
1449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const RenderLayer* currLayer = this;
1452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while (currLayer && currLayer != ancestorLayer)
1453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        currLayer = accumulateOffsetTowardsAncestor(currLayer, ancestorLayer, location);
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutRect& rect) const
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint delta;
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    convertToLayerCoords(ancestorLayer, delta);
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect.move(-delta.x(), -delta.y());
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void RenderLayer::didUpdateNeedsCompositedScrolling()
14645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
146553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateSelfPaintingLayer();
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1468f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderLayer::updateReflectionInfo(const RenderStyle* oldStyle)
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
147009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle));
1471f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (renderer()->hasReflection()) {
1472f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (!m_reflectionInfo)
1473e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            m_reflectionInfo = adoptPtrWillBeNoop(new RenderLayerReflectionInfo(*renderBox()));
1474f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_reflectionInfo->updateAfterStyleChange(oldStyle);
1475f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    } else if (m_reflectionInfo) {
1476e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_reflectionInfo->destroy();
1477f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_reflectionInfo = nullptr;
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1481bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void RenderLayer::updateStackingNode()
1482bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1483bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (requiresStackingNode())
1484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_stackingNode = adoptPtr(new RenderLayerStackingNode(this));
1485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    else
1486bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_stackingNode = nullptr;
1487bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1488bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
14891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void RenderLayer::updateScrollableArea()
14901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
14911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (requiresScrollableArea())
1492323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_scrollableArea = adoptPtr(new RenderLayerScrollableArea(*this));
14931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    else
14941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_scrollableArea = nullptr;
14951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
14961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hasOverflowControls() const
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_scrollableArea && (m_scrollableArea->hasScrollbar() || m_scrollableArea->hasScrollCorner() || renderer()->style()->resize() != RESIZE_NONE);
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot, PaintLayerFlags paintFlags)
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1504c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
1505e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (shouldPaintLayerInSoftwareMode(paintingInfo, paintFlags))
1506c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        paintLayer(context, paintingInfo, paintFlags);
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::paintOverlayScrollbars(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_containsDirtyOverlayScrollbars)
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1513926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
1515926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
1516926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_containsDirtyOverlayScrollbars = false;
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool inContainingBlockChain(RenderLayer* startLayer, RenderLayer* endLayer)
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (startLayer == endLayer)
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
152402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* view = startLayer->renderer()->view();
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderBlock* currentBlock = startLayer->renderer()->containingBlock(); currentBlock && currentBlock != view; currentBlock = currentBlock->containingBlock()) {
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (currentBlock->layer() == endLayer)
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
153002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1534d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void RenderLayer::clipToRect(const LayerPaintingInfo& localPaintingInfo, GraphicsContext* context, const ClipRect& clipRect,
1535d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PaintLayerFlags paintFlags, BorderRadiusClippingRule rule)
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (clipRect.rect() == localPaintingInfo.paintDirtyRect && !clipRect.hasRadius())
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context->save();
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context->clip(pixelSnappedIntRect(clipRect.rect()));
154102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!clipRect.hasRadius())
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the clip rect has been tainted by a border radius, then we have to walk up our layer chain applying the clips from
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // any layers with overflow. The condition for being able to apply these clips is that the overflow object be in our
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // containing block chain so we check that also.
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? this : parent(); layer; layer = layer->parent()) {
1549d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Composited scrolling layers handle border-radius clip in the compositor via a mask layer. We do not
1550d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // want to apply a border-radius clip to the layer contents itself, because that would require re-rastering
1551d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // every frame to update the clip. We only want to make sure that the mask layer is properly clipped so
1552d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // that it can in turn clip the scrolled contents in the compositor.
1553d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))
1554d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            break;
1555d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()->hasBorderRadius() && inContainingBlockChain(this, layer)) {
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                LayoutPoint delta;
1558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta);
1559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                context->clipRoundedRect(layer->renderer()->style()->getRoundedInnerBorderFor(LayoutRect(delta, layer->size())));
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (layer == localPaintingInfo.rootLayer)
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::restoreClip(GraphicsContext* context, const LayoutRect& paintDirtyRect, const ClipRect& clipRect)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (clipRect.rect() == paintDirtyRect && !clipRect.hasRadius())
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    context->restore();
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool shouldSuppressPaintingLayer(RenderLayer* layer)
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Avoid painting descendants of the root layer when stylesheets haven't loaded. This eliminates FOUC.
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
15789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // will do a full paintInvalidationForWholeRenderer().
15796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !layer->isRootLayer() && !layer->renderer()->isDocumentElement())
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlags paintFlags)
1586e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
15876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return layer->renderer()->isDocumentElement() && (paintFlags & PaintLayerPaintingRootBackgroundOnly);
1588e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1589e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1590d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paintFlags, const RenderObject* renderer)
1591d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1592d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & PaintLayerPaintingChildClippingMaskPhase && renderer->hasClipPath())) ? IgnoreOverflowClip : RespectOverflowClip;
1593d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1594d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
159709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // https://code.google.com/p/chromium/issues/detail?id=343772
159809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    DisableCompositingQueryAsserts disabler;
159909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1600c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (compositingState() != NotComposited) {
1601e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers) {
1602c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            // FIXME: ok, but what about PaintBehaviorFlattenCompositingLayers? That's for printing.
1603c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            // FIXME: why isn't the code here global, as opposed to being set on each paintLayer() call?
1604197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            paintFlags |= PaintLayerUncachedClipRects;
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Non self-painting leaf layers don't need to be painted as their renderer() should properly paint itself.
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (shouldSuppressPaintingLayer(this))
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
161402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this layer is totally invisible then there is nothing to paint.
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()->opacity())
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (paintsWithTransparency(paintingInfo.paintBehavior))
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        paintFlags |= PaintLayerHaveTransparency;
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // PaintLayerAppliedTransform is used in RenderReplica, to avoid applying the transform twice.
1623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (paintsWithTransform(paintingInfo.paintBehavior) && !(paintFlags & PaintLayerAppliedTransform)) {
1624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        TransformationMatrix layerTransform = renderableTransform(paintingInfo.paintBehavior);
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the transform can't be inverted, then don't paint anything.
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!layerTransform.isInvertible())
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we have a transparency layer enclosing us and we are the root of a transform, then we need to establish the transparency
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // layer from the parent now, assuming there is a parent
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (paintFlags & PaintLayerHaveTransparency) {
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (parent())
1633d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                parent()->beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
1635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
1636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
1637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (enclosingPaginationLayer()) {
1639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            paintTransformedLayerIntoFragments(context, paintingInfo, paintFlags);
1640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make sure the parent's clip rects have been calculated.
1644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ClipRect clipRect = paintingInfo.paintDirtyRect;
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parent()) {
1646197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize);
1647197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (shouldRespectOverflowClip(paintFlags, renderer()) == IgnoreOverflowClip)
1648197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                clipRectsContext.setIgnoreOverflowClip();
164909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            clipRect = clipper().backgroundClipRect(clipRectsContext);
1650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            clipRect.intersect(paintingInfo.paintDirtyRect);
165102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Push the parent coordinate space's clip.
1653d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            parent()->clipToRect(paintingInfo, context, clipRect, paintFlags);
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintLayerByApplyingTransform(context, paintingInfo, paintFlags);
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Restore the clip.
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parent())
1660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            parent()->restoreClip(context, paintingInfo.paintDirtyRect, clipRect);
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
166402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintLayerContentsAndReflection(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform);
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Paint the reflection first if we have one.
1675f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (m_reflectionInfo)
1676f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        m_reflectionInfo->paint(context, paintingInfo, localPaintFlags | PaintLayerPaintingReflection);
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    localPaintFlags |= PaintLayerPaintingCompositingAllPhases;
1679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintLayerContents(context, paintingInfo, localPaintFlags);
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
1685f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    ASSERT(!(paintFlags & PaintLayerAppliedTransform));
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1687f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool haveTransparency = paintFlags & PaintLayerHaveTransparency;
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSelfPaintingLayer = this->isSelfPaintingLayer();
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScrollbars;
1690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositingScrollingPhase;
1691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingCompositingForegroundPhase;
1692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingCompositingBackgroundPhase;
1693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowContents;
1694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Outline always needs to be painted even if we have no visible content. Also,
1695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // the outline is painted in the background phase during composited scrolling.
1696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If it were painted in the foreground phase, it would move with the scrolled
1697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // content. When not composited scrolling, the outline is painted in the
16989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // foreground phase. Since scrolled contents are moved by paint invalidation in this
1699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // case, the outline won't get 'dragged along'.
1700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldPaintOutline = isSelfPaintingLayer && !isPaintingOverlayScrollbars
1701926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        && ((isPaintingScrollingContent && isPaintingCompositedBackground)
1702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        || (!isPaintingScrollingContent && isPaintingCompositedForeground));
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shouldPaintContent = m_hasVisibleContent && isSelfPaintingLayer && !isPaintingOverlayScrollbars;
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float deviceScaleFactor = blink::deviceScaleFactor(renderer()->frame());
1706c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    context->setDeviceScaleFactor(deviceScaleFactor);
17077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GraphicsContext* transparencyLayerContext = context;
170902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !renderer()->isRenderView() && !renderer()->isDocumentElement())
1711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ensure our lists are up-to-date.
1714bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_stackingNode->updateLayerListsIfNeeded();
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint offsetFromRoot;
1717926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot);
1718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
171909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (compositingState() == PaintsIntoOwnBacking)
1720a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        offsetFromRoot.move(subpixelAccumulation());
172109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
172209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    LayoutRect rootRelativeBounds;
1723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool rootRelativeBoundsComputed = false;
1724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apply clip-path to context.
1726197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    GraphicsContextStateSaver clipStateSaver(*context, false);
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* style = renderer()->style();
1728c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RenderSVGResourceClipper* resourceClipper = 0;
17297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RenderSVGResourceClipper::ClipperState clipperState = RenderSVGResourceClipper::ClipperNotApplied;
1730d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1731d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container.
1732d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // It must, however, still be applied to the mask layer, so that the compositor can properly mask the
1733d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // scrolling contents and scrollbars.
1734e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (renderer()->hasClipPath() && style && (!needsCompositedScrolling() || paintFlags & PaintLayerPaintingChildClippingMaskPhase)) {
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(style->clipPath());
173651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (style->clipPath()->type() == ClipPathOperation::SHAPE) {
173751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            ShapeClipPathOperation* clipPath = toShapeClipPathOperation(style->clipPath());
1738c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (clipPath->isValid()) {
1739c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                clipStateSaver.save();
1740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1741c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                if (!rootRelativeBoundsComputed) {
1742c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                    rootRelativeBounds = physicalBoundingBoxIncludingReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
1743c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                    rootRelativeBoundsComputed = true;
1744c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                }
1745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1746c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                context->clipPath(clipPath->path(rootRelativeBounds), clipPath->windRule());
1747c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            }
174851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        } else if (style->clipPath()->type() == ClipPathOperation::REFERENCE) {
174951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            ReferenceClipPathOperation* referenceClipPathOperation = toReferenceClipPathOperation(style->clipPath());
17508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            Document& document = renderer()->document();
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // FIXME: It doesn't work with forward or external SVG references (https://bugs.webkit.org/show_bug.cgi?id=90405)
17528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            Element* element = document.getElementById(referenceClipPathOperation->fragment());
1753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (isSVGClipPathElement(element) && element->renderer()) {
1754197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                // FIXME: Saving at this point is not required in the 'mask'-
1755197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                // case, or if the clip ends up empty.
1756197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                clipStateSaver.save();
1757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (!rootRelativeBoundsComputed) {
1758a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    rootRelativeBounds = physicalBoundingBoxIncludingReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
1759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    rootRelativeBoundsComputed = true;
1760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
1761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1762bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)                resourceClipper = toRenderSVGResourceClipper(toRenderSVGResourceContainer(element->renderer()));
17631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                if (!resourceClipper->applyClippingToContext(renderer(), rootRelativeBounds,
17647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    paintingInfo.paintDirtyRect, context, clipperState)) {
1765c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)                    // No need to post-apply the clipper if this failed.
1766c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)                    resourceClipper = 0;
1767c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)                }
1768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1772bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // Blending operations must be performed only with the nearest ancestor stacking context.
1773f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // Note that there is no need to create a transparency layer if we're painting the root.
1774e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool createTransparencyLayerForBlendMode = !renderer()->isDocumentElement() && m_stackingNode->isStackingContext() && hasDescendantWithBlendMode();
1775bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1776bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (createTransparencyLayerForBlendMode)
1777d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
1778bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1779926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerPaintingInfo localPaintingInfo(paintingInfo);
17809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool deferredFiltersEnabled = renderer()->document().settings()->deferredFiltersEnabled();
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FilterEffectRendererHelper filterPainter(filterRenderer() && paintsWithFilters());
17829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
17839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayerFragments layerFragments;
17849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) {
17859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // Collect the fragments. This will compute the clip rectangles and paint offsets for each layer fragment, as well as whether or not the content of each
17869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // fragment should paint.
17879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        collectFragments(layerFragments, localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect,
17889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize,
17899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            shouldRespectOverflowClip(paintFlags, renderer()), &offsetFromRoot, localPaintingInfo.subPixelAccumulation);
17909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        updatePaintingInfoForFragments(layerFragments, localPaintingInfo, paintFlags, shouldPaintContent, &offsetFromRoot);
17919e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
17929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1793e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (filterPainter.haveFilterEffect()) {
1794e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ASSERT(this->filterInfo());
1795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
179609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!rootRelativeBoundsComputed)
1797a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            rootRelativeBounds = physicalBoundingBoxIncludingReflectionAndStackingChildren(paintingInfo.rootLayer, offsetFromRoot);
1798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1799e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (filterPainter.prepareFilterEffect(this, rootRelativeBounds, paintingInfo.paintDirtyRect)) {
18009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Rewire the old context to a memory buffer, so that we can capture the contents of the layer.
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // NOTE: We saved the old context in the "transparencyLayerContext" local variable, to be able to start a transparency layer
180302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            // on the original context and avoid duplicating "beginFilterEffect" after each transparency layer call. Also, note that
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // beginTransparencyLayers will only create a single lazy transparency layer, even though it is called twice in this method.
18059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            // With deferred filters, we don't need a separate context, but we do need to do transparency and clipping before starting
18069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            // filter processing.
18079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            // FIXME: when the legacy path is removed, remove the transparencyLayerContext as well.
18082fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)            ClipRect backgroundRect;
18099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            if (deferredFiltersEnabled) {
18109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                if (haveTransparency) {
18119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                    // If we have a filter and transparency, we have to eagerly start a transparency layer here, rather than risk a child layer lazily starts one after filter processing.
18129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                    beginTransparencyLayers(context, localPaintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, localPaintingInfo.paintBehavior);
18139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                }
18149e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                // We'll handle clipping to the dirty rect before filter rasterization.
18159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                // Filter processing will automatically expand the clip rect and the offscreen to accommodate any filter outsets.
18169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                // FIXME: It is incorrect to just clip to the damageRect here once multiple fragments are involved.
18172fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)                backgroundRect = layerFragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect;
18189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                clipToRect(localPaintingInfo, context, backgroundRect, paintFlags);
18199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                // Subsequent code should not clip to the dirty rect, since we've already
18209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                // done it above, and doing it later will defeat the outsets.
18219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                localPaintingInfo.clipToDirtyRect = false;
18229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            }
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            context = filterPainter.beginFilterEffect(context);
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18252fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)            if (!filterPainter.hasStartedFilterEffect() && deferredFiltersEnabled) {
18262fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)                // If the the filter failed to start, undo the clip immediately
18272fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)                restoreClip(context, localPaintingInfo.paintDirtyRect, backgroundRect);
18282fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)            }
18292fb29a03d7c71253319f61b77edc6c1e3a8fc8e2Torne (Richard Coles)
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Check that we didn't fail to allocate the graphics context for the offscreen buffer.
18319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            if (filterPainter.hasStartedFilterEffect() && !deferredFiltersEnabled) {
18329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                localPaintingInfo.paintDirtyRect = filterPainter.paintInvalidationRect();
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // If the filter needs the full source image, we need to avoid using the clip rectangles.
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Otherwise, if for example this layer has overflow:hidden, a drop shadow will not compute correctly.
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Note that we will still apply the clipping on the final rendering of the filter.
1836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                localPaintingInfo.clipToDirtyRect = !filterRenderer()->hasFilterThatMovesPixels();
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1840926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
18419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (filterPainter.hasStartedFilterEffect() && haveTransparency && !deferredFiltersEnabled) {
1842926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // If we have a filter and transparency, we have to eagerly start a transparency layer here, rather than risk a child layer lazily starts one with the wrong context.
1843d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        beginTransparencyLayers(transparencyLayerContext, localPaintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, localPaintingInfo.paintBehavior);
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this layer's renderer is a child of the paintingRoot, we render unconditionally, which
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is done by passing a nil paintingRoot down to our renderer (as if no paintingRoot was ever set).
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Else, our renderer tree may or may not contain the painting root, so we pass that root along
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so it will be tested against as we descend through the renderers.
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* paintingRootForRenderer = 0;
1851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (localPaintingInfo.paintingRoot && !renderer()->isDescendantOf(localPaintingInfo.paintingRoot))
1852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintingRootForRenderer = localPaintingInfo.paintingRoot;
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1854c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText));
1855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool selectionOnly  = localPaintingInfo.paintBehavior & PaintBehaviorSelectionOnly;
185602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1857fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool shouldPaintBackground = isPaintingCompositedBackground && shouldPaintContent && !selectionOnly;
1858fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintingOverflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackground);
1859fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPaintContent;
1860fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForeground;
1861fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars;
1862f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase) && shouldPaintContent && renderer()->hasMask() && !selectionOnly;
1863f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool shouldPaintClippingMask = (paintFlags & PaintLayerPaintingChildClippingMaskPhase) && shouldPaintContent && !selectionOnly;
1864fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PaintBehavior paintBehavior = PaintBehaviorNormal;
1866f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (paintFlags & PaintLayerPaintingSkipRootBackground)
1867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintBehavior |= PaintBehaviorSkipRootBackground;
1868f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    else if (paintFlags & PaintLayerPaintingRootBackgroundOnly)
1869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintBehavior |= PaintBehaviorRootBackgroundOnly;
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1871d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (shouldPaintBackground) {
1872fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        paintBackgroundForFragments(layerFragments, context, transparencyLayerContext, paintingInfo.paintDirtyRect, haveTransparency,
1873d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
1874d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1876fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (shouldPaintNegZOrderList)
1877e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        paintChildren(NegativeZOrderChildren, context, paintingInfo, paintFlags);
187802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1879d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (shouldPaintOwnContents) {
1880fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        paintForegroundForFragments(layerFragments, context, transparencyLayerContext, paintingInfo.paintDirtyRect, haveTransparency,
1881c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            localPaintingInfo, paintBehavior, paintingRootForRenderer, selectionOnly, paintFlags);
1882d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1884926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (shouldPaintOutline)
1885d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        paintOutlineForFragments(layerFragments, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
1886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
188751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (shouldPaintNormalFlowAndPosZOrderLists)
1888e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, paintingInfo, paintFlags);
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1890fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (shouldPaintOverlayScrollbars)
1891d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        paintOverflowControlsForFragments(layerFragments, context, localPaintingInfo, paintFlags);
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (filterPainter.hasStartedFilterEffect()) {
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Apply the correct clipping (ie. overflow: hidden).
1895926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: It is incorrect to just clip to the damageRect here once multiple fragments are involved.
1896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ClipRect backgroundRect = layerFragments.isEmpty() ? ClipRect() : layerFragments[0].backgroundRect;
18979e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!deferredFiltersEnabled)
18989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            clipToRect(localPaintingInfo, transparencyLayerContext, backgroundRect, paintFlags);
18999e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context = filterPainter.applyFilterEffect();
1901926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        restoreClip(transparencyLayerContext, localPaintingInfo.paintDirtyRect, backgroundRect);
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
190302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure that we now use the original transparency context.
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(transparencyLayerContext == context);
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1907fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    if (shouldPaintMask)
1908d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        paintMaskForFragments(layerFragments, context, localPaintingInfo, paintingRootForRenderer, paintFlags);
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (shouldPaintClippingMask) {
191106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        // Paint the border radius mask for the fragments.
1912d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        paintChildClippingMaskForFragments(layerFragments, context, localPaintingInfo, paintingRootForRenderer, paintFlags);
191306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
191406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // End our transparency layer
191619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if ((haveTransparency || paintsWithBlendMode() || createTransparencyLayerForBlendMode) && m_usedTransparency && !(m_reflectionInfo && m_reflectionInfo->isPaintingInsideReflection())) {
1917c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        context->endLayer();
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context->restore();
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_usedTransparency = false;
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1922c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (resourceClipper)
19237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        resourceClipper->postApplyStatefulResource(renderer(), context, clipperState);
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintLayerByApplyingTransform(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, const LayoutPoint& translationOffset)
1927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This involves subtracting out the position of the layer in our current coordinate space, but preserving
1929926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // the accumulated error for sub-pixel layout.
1930926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint delta;
1931926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    convertToLayerCoords(paintingInfo.rootLayer, delta);
1932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    delta.moveBy(translationOffset);
1933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TransformationMatrix transform(renderableTransform(paintingInfo.paintBehavior));
1934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntPoint roundedDelta = roundedIntPoint(delta);
1935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    transform.translateRight(roundedDelta.x(), roundedDelta.y());
1936926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + (delta - roundedDelta);
1937926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1938926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Apply the transform.
193909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextStateSaver stateSaver(*context, false);
194009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!transform.isIdentity()) {
194109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        stateSaver.save();
194209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        context->concatCTM(transform.toAffineTransform());
194309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
1944926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1945926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Now do a paint with the root layer shifted to be us.
1946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerPaintingInfo transformedPaintingInfo(this, enclosingIntRect(transform.inverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBehavior,
1947c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        adjustedSubPixelAccumulation, paintingInfo.paintingRoot);
1948926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags);
1949926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1950926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1951e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool RenderLayer::shouldPaintLayerInSoftwareMode(const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
1952c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1953c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    DisableCompositingQueryAsserts disabler;
1954c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1955c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return compositingState() == NotComposited
1956c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || compositingState() == HasOwnBackingButPaintsIntoAncestor
1957c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)
1958c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || ((paintFlags & PaintLayerPaintingReflection) && !has3DTransform())
1959c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || paintForFixedRootBackground(this, paintFlags);
1960c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1961c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
196251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasSelfPaintingLayerDescendant())
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1967197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
1968bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    LayerListMutationDetector mutationChecker(m_stackingNode.get());
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit);
197251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (RenderLayerStackingNode* child = iterator.next()) {
197351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        RenderLayer* childLayer = child->layer();
1974c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // If this RenderLayer should paint into its own backing or a grouped backing, that will be done via CompositedLayerMapping::paintContents()
1975c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // and CompositedLayerMapping::doPaintTask().
1976e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!childLayer->shouldPaintLayerInSoftwareMode(paintingInfo, paintFlags))
197709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            continue;
197809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!childLayer->isPaginated())
1980926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            childLayer->paintLayer(context, paintingInfo, paintFlags);
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1982926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            paintPaginatedChildLayer(childLayer, context, paintingInfo, paintFlags);
1983926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1984926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
198609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer* rootLayer, const LayoutRect& dirtyRect,
1987197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ClipRectsCacheSlot clipRectsCacheSlot, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const LayoutPoint* offsetFromRoot,
198809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox)
1989926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1990926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!enclosingPaginationLayer() || hasTransform()) {
1991926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // For unpaginated layers, there is only one fragment.
1992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayerFragment fragment;
1993197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, inOverlayScrollbarSizeRelevancy, subPixelAccumulation);
1994197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (respectOverflowClip == IgnoreOverflowClip)
1995197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            clipRectsContext.setIgnoreOverflowClip();
199609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        clipper().calculateRects(clipRectsContext, dirtyRect, fragment.layerBounds, fragment.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offsetFromRoot);
1997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragments.append(fragment);
1998926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1999926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
200002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2001926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Compute our offset within the enclosing pagination layer.
2002926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint offsetWithinPaginatedLayer;
2003926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    convertToLayerCoords(enclosingPaginationLayer(), offsetWithinPaginatedLayer);
200402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2005926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Calculate clip rects relative to the enclosingPaginationLayer. The purpose of this call is to determine our bounds clipped to intermediate
2006926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // layers between us and the pagination context. It's important to minimize the number of fragments we need to create and this helps with that.
2007197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ClipRectsContext paginationClipRectsContext(enclosingPaginationLayer(), clipRectsCacheSlot, inOverlayScrollbarSizeRelevancy);
2008197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (respectOverflowClip == IgnoreOverflowClip)
2009197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        paginationClipRectsContext.setIgnoreOverflowClip();
2010926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect layerBoundsInFlowThread;
2011926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ClipRect backgroundRectInFlowThread;
2012926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ClipRect foregroundRectInFlowThread;
2013926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ClipRect outlineRectInFlowThread;
201409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    clipper().calculateRects(paginationClipRectsContext, PaintInfo::infiniteRect(), layerBoundsInFlowThread, backgroundRectInFlowThread, foregroundRectInFlowThread,
2015926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        outlineRectInFlowThread, &offsetWithinPaginatedLayer);
201602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2017926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Take our bounding box within the flow thread and clip it.
2018a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutRect layerBoundingBoxInFlowThread = layerBoundingBox ? *layerBoundingBox : physicalBoundingBox(enclosingPaginationLayer(), &offsetWithinPaginatedLayer);
2019926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    layerBoundingBoxInFlowThread.intersect(backgroundRectInFlowThread.rect());
2020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Shift the dirty rect into flow thread coordinates.
2022926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint offsetOfPaginationLayerFromRoot;
2023926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
2024926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect dirtyRectInFlowThread(dirtyRect);
2025926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dirtyRectInFlowThread.moveBy(-offsetOfPaginationLayerFromRoot);
2026926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2027926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Tell the flow thread to collect the fragments. We pass enough information to create a minimal number of fragments based off the pages/columns
2028926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // that intersect the actual dirtyRect as well as the pages/columns that intersect our layer's bounding box.
2029926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderFlowThread* enclosingFlowThread = toRenderFlowThread(enclosingPaginationLayer()->renderer());
2030926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    enclosingFlowThread->collectLayerFragments(fragments, layerBoundingBoxInFlowThread, dirtyRectInFlowThread);
203102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2032926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (fragments.isEmpty())
2033926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
203402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2035926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Get the parent clip rects of the pagination layer, since we need to intersect with that when painting column contents.
2036926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ClipRect ancestorClipRect = dirtyRect;
2037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (enclosingPaginationLayer()->parent()) {
2038197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, inOverlayScrollbarSizeRelevancy);
2039197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (respectOverflowClip == IgnoreOverflowClip)
2040197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            clipRectsContext.setIgnoreOverflowClip();
204109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ancestorClipRect = enclosingPaginationLayer()->clipper().backgroundClipRect(clipRectsContext);
2042926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ancestorClipRect.intersect(dirtyRect);
2043926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2044926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2045926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < fragments.size(); ++i) {
2046926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayerFragment& fragment = fragments.at(i);
204702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2048926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Set our four rects with all clipping applied that was internal to the flow thread.
2049926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragment.setRects(layerBoundsInFlowThread, backgroundRectInFlowThread, foregroundRectInFlowThread, outlineRectInFlowThread);
205002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2051926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Shift to the root-relative physical position used when painting the flow thread in this fragment.
2052926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragment.moveBy(fragment.paginationOffset + offsetOfPaginationLayerFromRoot);
2053926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2054926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Intersect the fragment with our ancestor's background clip so that e.g., columns in an overflow:hidden block are
2055926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // properly clipped by the overflow.
2056926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragment.intersect(ancestorClipRect.rect());
205702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2058926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Now intersect with our pagination clip. This will typically mean we're just intersecting the dirty rect with the column
2059926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // clip, so the column clip ends up being all we apply.
2060926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragment.intersect(fragment.paginationClip);
2061926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2062926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2063926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2064926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::updatePaintingInfoForFragments(LayerFragments& fragments, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags,
2065926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldPaintContent, const LayoutPoint* offsetFromRoot)
2066926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2067926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(offsetFromRoot);
2068926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < fragments.size(); ++i) {
2069926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayerFragment& fragment = fragments.at(i);
2070926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        fragment.shouldPaintContent = shouldPaintContent;
2071926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this != localPaintingInfo.rootLayer || !(localPaintFlags & PaintLayerPaintingOverflowContents)) {
2072926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            LayoutPoint newOffsetFromRoot = *offsetFromRoot + fragment.paginationOffset;
2073926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            fragment.shouldPaintContent &= intersectsDamageRect(fragment.layerBounds, fragment.backgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFromRoot);
2074926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2078926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintTransformedLayerIntoFragments(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
2079926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2080926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerFragments enclosingPaginationFragments;
2081926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint offsetOfPaginationLayerFromRoot;
2082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LayoutRect transformedExtent = transparencyClipBox(this, enclosingPaginationLayer(), PaintingTransparencyClipBox, RootOfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
208309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, paintingInfo.rootLayer, paintingInfo.paintDirtyRect,
2084197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize,
2085d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        shouldRespectOverflowClip(paintFlags, renderer()), &offsetOfPaginationLayerFromRoot, paintingInfo.subPixelAccumulation, &transformedExtent);
208602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2087926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < enclosingPaginationFragments.size(); ++i) {
2088926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = enclosingPaginationFragments.at(i);
208902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2090926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Apply the page/column clip for this fragment, as well as any clips established by layers in between us and
2091926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // the enclosing pagination layer.
2092926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutRect clipRect = fragment.backgroundRect.rect();
209302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Now compute the clips within a given fragment
2095926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (parent() != enclosingPaginationLayer()) {
2096926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            enclosingPaginationLayer()->convertToLayerCoords(paintingInfo.rootLayer, offsetOfPaginationLayerFromRoot);
209702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2098197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            ClipRectsContext clipRectsContext(enclosingPaginationLayer(), (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOverlayScrollbarSize);
2099197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (shouldRespectOverflowClip(paintFlags, renderer()) == IgnoreOverflowClip)
2100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                clipRectsContext.setIgnoreOverflowClip();
210109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            LayoutRect parentClipRect = clipper().backgroundClipRect(clipRectsContext).rect();
2102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            parentClipRect.moveBy(fragment.paginationOffset + offsetOfPaginationLayerFromRoot);
2103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            clipRect.intersect(parentClipRect);
2104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        parent()->clipToRect(paintingInfo, context, clipRect, paintFlags);
2107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragment.paginationOffset);
2108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parent()->restoreClip(context, paintingInfo.paintDirtyRect, clipRect);
2109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
211209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static inline LayoutSize subPixelAccumulationIfNeeded(const LayoutSize& subPixelAccumulation, CompositingState compositingState)
211309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
211409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Only apply the sub-pixel accumulation if we don't paint into our own backing layer, otherwise the position
211509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // of the renderer already includes any sub-pixel offset.
211609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (compositingState == PaintsIntoOwnBacking)
211709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return LayoutSize();
211809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return subPixelAccumulation;
211909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
212009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintBackgroundForFragments(const LayerFragments& layerFragments, GraphicsContext* context, GraphicsContext* transparencyLayerContext,
2122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior,
2123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
2124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
2126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!fragment.shouldPaintContent)
2128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
2129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Begin transparency layers lazily now that we know we have to paint something.
213119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (haveTransparency || paintsWithBlendMode())
2132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            beginTransparencyLayers(transparencyLayerContext, localPaintingInfo.rootLayer, transparencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingInfo.paintBehavior);
213302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect) {
2135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Paint our background first, before painting any child layers.
2136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // Establish the clip used to paint our background.
2137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            clipToRect(localPaintingInfo, context, fragment.backgroundRect, paintFlags, DoNotIncludeSelfForBorderRadius); // Background painting will handle clipping to self.
2138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
213902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Paint the background.
2141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
2142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect.rect()), PaintPhaseBlockBackground, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
214309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        renderer()->paint(paintInfo, toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState())));
2144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect)
2146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
2147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintForegroundForFragments(const LayerFragments& layerFragments, GraphicsContext* context, GraphicsContext* transparencyLayerContext,
2151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior,
2152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderObject* paintingRootForRenderer, bool selectionOnly, PaintLayerFlags paintFlags)
2153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Begin transparency if we have something to paint.
215519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (haveTransparency || paintsWithBlendMode()) {
2156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (size_t i = 0; i < layerFragments.size(); ++i) {
2157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const LayerFragment& fragment = layerFragments.at(i);
2158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (fragment.shouldPaintContent && !fragment.foregroundRect.isEmpty()) {
2159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                beginTransparencyLayers(transparencyLayerContext, localPaintingInfo.rootLayer, transparencyPaintDirtyRect, localPaintingInfo.subPixelAccumulation, localPaintingInfo.paintBehavior);
2160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                break;
2161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
2162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
216402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Optimize clipping for the single fragment case.
2166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && layerFragments[0].shouldPaintContent && !layerFragments[0].foregroundRect.isEmpty();
2167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (shouldClip)
2168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        clipToRect(localPaintingInfo, context, layerFragments[0].foregroundRect, paintFlags);
216902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
21709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // We have to loop through every fragment multiple times, since we have to issue paint invalidations in each specific phase in order for
2171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // interleaving of the fragments to work properly.
2172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintForegroundForFragmentsWithPhase(selectionOnly ? PaintPhaseSelection : PaintPhaseChildBlockBackgrounds, layerFragments,
2173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
217402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!selectionOnly) {
2176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        paintForegroundForFragmentsWithPhase(PaintPhaseFloat, layerFragments, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
2177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        paintForegroundForFragmentsWithPhase(PaintPhaseForeground, layerFragments, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
2178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        paintForegroundForFragmentsWithPhase(PaintPhaseChildOutlines, layerFragments, context, localPaintingInfo, paintBehavior, paintingRootForRenderer, paintFlags);
2179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
218002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (shouldClip)
2182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        restoreClip(context, localPaintingInfo.paintDirtyRect, layerFragments[0].foregroundRect);
2183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintForegroundForFragmentsWithPhase(PaintPhase phase, const LayerFragments& layerFragments, GraphicsContext* context,
2186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const LayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
2187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() > 1;
2189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
2191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!fragment.shouldPaintContent || fragment.foregroundRect.isEmpty())
2193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
219402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (shouldClip)
2196d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            clipToRect(localPaintingInfo, context, fragment.foregroundRect, paintFlags);
219702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.foregroundRect.rect()), phase, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
219909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        renderer()->paint(paintInfo, toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState())));
220002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (shouldClip)
2202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.foregroundRect);
2203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintOutlineForFragments(const LayerFragments& layerFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
2207d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
2208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
2210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (fragment.outlineRect.isEmpty())
2212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
221302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Paint our own outline
2215c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.outlineRect.rect()), PaintPhaseSelfOutline, paintBehavior, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
2216d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        clipToRect(localPaintingInfo, context, fragment.outlineRect, paintFlags, DoNotIncludeSelfForBorderRadius);
221709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        renderer()->paint(paintInfo, toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState())));
2218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.outlineRect);
2219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintMaskForFragments(const LayerFragments& layerFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
2223d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
2224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
2226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!fragment.shouldPaintContent)
2228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
2229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect)
2231d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            clipToRect(localPaintingInfo, context, fragment.backgroundRect, paintFlags, DoNotIncludeSelfForBorderRadius); // Mask painting will handle clipping to self.
223202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Paint the mask.
2234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
2235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect.rect()), PaintPhaseMask, PaintBehaviorNormal, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
223609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        renderer()->paint(paintInfo, toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState())));
223702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect)
2239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
2240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
224306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void RenderLayer::paintChildClippingMaskForFragments(const LayerFragments& layerFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo,
2244d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags)
224506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
224606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
224706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
224806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (!fragment.shouldPaintContent)
224906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            continue;
225006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
225106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect)
2252d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            clipToRect(localPaintingInfo, context, fragment.foregroundRect, paintFlags, IncludeSelfForBorderRadius); // Child clipping mask painting will handle clipping to self.
225306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
225406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        // Paint the the clipped mask.
2255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        PaintInfo paintInfo(context, pixelSnappedIntRect(fragment.backgroundRect.rect()), PaintPhaseClippingMask, PaintBehaviorNormal, paintingRootForRenderer, 0, localPaintingInfo.rootLayer->renderer());
225609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        renderer()->paint(paintInfo, toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState())));
225706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
225806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (localPaintingInfo.clipToDirtyRect)
225906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.foregroundRect);
226006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
226106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
226206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
2263d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void RenderLayer::paintOverflowControlsForFragments(const LayerFragments& layerFragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags)
2264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < layerFragments.size(); ++i) {
2266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2267d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        clipToRect(localPaintingInfo, context, fragment.backgroundRect, paintFlags);
2268f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (RenderLayerScrollableArea* scrollableArea = this->scrollableArea())
226909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            scrollableArea->paintOverflowControls(context, roundedIntPoint(toPoint(fragment.layerBounds.location() - renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, compositingState()))), pixelSnappedIntRect(fragment.backgroundRect.rect()), true);
2270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
2271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to do multiple passes, breaking up our child layer into strips.
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RenderLayer*> columnLayers;
2278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode();
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent()) {
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagination(childLayer->renderer(), curr->renderBox()))
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            columnLayers.append(curr);
2282f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (curr->stackingNode() == ancestorNode)
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It is possible for paintLayer() to be called after the child layer ceases to be paginated but before
2287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // updatePaginationRecusive() is called and resets the isPaginated() flag, see <rdar://problem/10098679>.
22889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // If this is the case, just bail out, since the upcoming call to updatePaginationRecusive() will paint invalidate the layer.
2289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // FIXME: Is this true anymore? This seems very suspicious.
22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!columnLayers.size())
22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    paintChildLayerIntoColumns(childLayer, context, paintingInfo, paintFlags, columnLayers, columnLayers.size() - 1);
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderLayer::paintChildLayerIntoColumns(RenderLayer* childLayer, GraphicsContext* context, const LayerPaintingInfo& paintingInfo,
2297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PaintLayerFlags paintFlags, const Vector<RenderLayer*>& columnLayers, size_t colIndex)
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlock* columnBlock = toRenderBlock(columnLayers[colIndex]->renderer());
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(columnBlock && columnBlock->hasColumns());
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!columnBlock || !columnBlock->hasColumns())
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
230402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint layerOffset;
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: It looks suspicious to call convertToLayerCoords here
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // as canUseConvertToLayerCoords is true for this layer.
2308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    columnBlock->layer()->convertToLayerCoords(paintingInfo.rootLayer, layerOffset);
230902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isHorizontal = columnBlock->style()->isHorizontalWritingMode();
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ColumnInfo* colInfo = columnBlock->columnInfo();
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned colCount = columnBlock->columnCount(colInfo);
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit currLogicalTopOffset = 0;
23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < colCount; i++) {
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For each rect, we clip to the rect, and then we adjust our coords.
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect colRect = columnBlock->columnRectAt(colInfo, i);
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        columnBlock->flipForWritingMode(colRect);
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit logicalLeftOffset = (isHorizontal ? colRect.x() : colRect.y()) - columnBlock->logicalLeftOffsetForContent();
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutSize offset;
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHorizontal) {
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(logicalLeftOffset, currLogicalTopOffset);
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(0, colRect.y() + currLogicalTopOffset - columnBlock->borderTop() - columnBlock->paddingTop());
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(currLogicalTopOffset, logicalLeftOffset);
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnBlock->borderLeft() - columnBlock->paddingLeft(), 0);
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        colRect.moveBy(layerOffset);
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutRect localDirtyRect(paintingInfo.paintDirtyRect);
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localDirtyRect.intersect(colRect);
233702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!localDirtyRect.isEmpty()) {
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            GraphicsContextStateSaver stateSaver(*context);
234002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Each strip pushes a clip, since column boxes are specified as being
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // like overflow:hidden.
2343f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            context->clip(enclosingIntRect(colRect));
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!colIndex) {
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Apply a translation transform to change where the layer paints.
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TransformationMatrix oldTransform;
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bool oldHasTransform = childLayer->transform();
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (oldHasTransform)
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    oldTransform = *childLayer->transform();
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TransformationMatrix newTransform(oldTransform);
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newTransform.translateRight(roundToInt(offset.width()), roundToInt(offset.height()));
235302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                childLayer->m_transform = adoptPtr(new TransformationMatrix(newTransform));
235502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                LayerPaintingInfo localPaintingInfo(paintingInfo);
2357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                localPaintingInfo.paintDirtyRect = localDirtyRect;
2358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                childLayer->paintLayer(context, localPaintingInfo, paintFlags);
2359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (oldHasTransform)
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    childLayer->m_transform = adoptPtr(new TransformationMatrix(oldTransform));
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    childLayer->m_transform.clear();
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Adjust the transform such that the renderer's upper left corner will paint at (0,0) in user space.
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // This involves subtracting out the position of the layer in our current coordinate space.
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                LayoutPoint childOffset;
2368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                columnLayers[colIndex - 1]->convertToLayerCoords(paintingInfo.rootLayer, childOffset);
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TransformationMatrix transform;
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                transform.translateRight(roundToInt(childOffset.x() + offset.width()), roundToInt(childOffset.y() + offset.height()));
237102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Apply the transform.
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                context->concatCTM(transform.toAffineTransform());
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Now do a paint with the root layer shifted to be the next multicol block.
2376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                LayerPaintingInfo columnPaintingInfo(paintingInfo);
2377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                columnPaintingInfo.rootLayer = columnLayers[colIndex - 1];
2378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                columnPaintingInfo.paintDirtyRect = transform.inverse().mapRect(localDirtyRect);
2379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                paintChildLayerIntoColumns(childLayer, context, columnPaintingInfo, paintFlags, columnLayers, colIndex - 1);
23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Move to the next position.
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit blockDelta = isHorizontal ? colRect.height() : colRect.width();
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (columnBlock->style()->isFlippedBlocksWritingMode())
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset += blockDelta;
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset -= blockDelta;
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline LayoutRect frameVisibleRect(RenderObject* renderer)
23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameView* frameView = renderer->document().view();
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frameView)
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LayoutRect();
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameView->visibleContentRect();
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hitTest(const HitTestRequest& request, HitTestResult& result)
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return hitTest(request, result.hitTestLocation(), result);
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hitTest(const HitTestRequest& request, const HitTestLocation& hitTestLocation, HitTestResult& result)
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // RenderView should make sure to update layout before entering hit testing
241193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!renderer()->frame()->view()->layoutPending());
2412d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT(!renderer()->document().renderView()->needsLayout());
241393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
2414d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    LayoutRect hitTestArea = renderer()->view()->documentRect();
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!request.ignoreClipping())
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hitTestArea.intersect(frameVisibleRect(renderer()));
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* insideLayer = hitTestLayer(this, 0, request, result, hitTestArea, hitTestLocation, false);
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!insideLayer) {
242002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down,
242102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // return ourselves. We do this so mouse events continue getting delivered after a drag has
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // exited the WebView, and so hit testing over a scrollbar hits the content document.
24237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // In addtion, it is possible for the mouse to stay in the document but there is no element.
24247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // At that time, the events of the mouse should be fired.
24257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        LayoutPoint hitPoint = hitTestLocation.point();
24267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!request.isChildFrameHitTest() && ((request.active() || request.release()) || (request.move() && hitTestArea.contains(hitPoint.x(), hitPoint.y()))) && isRootLayer()) {
2427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            renderer()->updateHitTestResult(result, toRenderView(renderer())->flipForWritingMode(hitTestLocation.point()));
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            insideLayer = this;
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now determine if the result is inside an anchor - if the urlElement isn't already set.
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* node = result.innerNode();
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node && !result.URLElement())
2435c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        result.setURLElement(node->enclosingLinkEventParentOrSelf());
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now return whether we were inside this layer (this will always be true for the root
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // layer).
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return insideLayer;
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* RenderLayer::enclosingElement() const
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderObject* r = renderer(); r; r = r->parent()) {
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Node* e = r->node())
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return e;
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::isInTopLayer() const
2453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* node = renderer()->node();
2455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return node && node->isElementNode() && toElement(node)->isInTopLayer();
2456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Compute the z-offset of the point in the transformState.
24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This is effectively projecting a ray normal to the plane of ancestor, finding where that
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ray intersects target, and computing the z delta between those two points.
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static double computeZOffset(const HitTestingTransformState& transformState)
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We got an affine transform, so no z-offset
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (transformState.m_accumulatedTransform.isAffine())
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Flatten the point into the target plane
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint targetPoint = transformState.mappedPoint();
246902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now map the point back through the transform, which computes Z.
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint3D backmappedPoint = transformState.m_accumulatedTransform.mapPoint(FloatPoint3D(targetPoint));
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return backmappedPoint.z();
24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HitTestingTransformState> RenderLayer::createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer,
24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
2477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                        const HitTestingTransformState* containerTransformState,
2478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                        const LayoutPoint& translationOffset) const
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<HitTestingTransformState> transformState;
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint offset;
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (containerTransformState) {
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we're already computing transform state, then it's relative to the container (which we know is non-null).
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transformState = HitTestingTransformState::create(*containerTransformState);
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        convertToLayerCoords(containerLayer, offset);
24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If this is the first time we need to make transform state, then base it off of hitTestLocation,
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // which is relative to rootLayer.
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transformState = HitTestingTransformState::create(hitTestLocation.transformedPoint(), hitTestLocation.transformedRect(), FloatQuad(hitTestRect));
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        convertToLayerCoords(rootLayer, offset);
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    offset.moveBy(translationOffset);
2493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* containerRenderer = containerLayer ? containerLayer->renderer() : 0;
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()->shouldUseTransformFromContainer(containerRenderer)) {
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransformationMatrix containerTransform;
24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderer()->getTransformFromContainer(containerRenderer, toLayoutSize(offset), containerTransform);
24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transformState->applyTransform(containerTransform, HitTestingTransformState::AccumulateTransform);
24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transformState->translate(offset.x(), offset.y(), HitTestingTransformState::AccumulateTransform);
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
250202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return transformState;
25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isHitCandidate(const RenderLayer* hitLayer, bool canDepthSort, double* zOffset, const HitTestingTransformState* transformState)
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hitLayer)
25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The hit layer is depth-sorting with other layers, so just say that it was hit.
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (canDepthSort)
25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
251502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to look at z-depth to decide if this layer was hit.
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (zOffset) {
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(transformState);
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This is actually computing our z, but that's OK because the hitLayer is coplanar with us.
25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double childZOffset = computeZOffset(*transformState);
25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (childZOffset > *zOffset) {
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *zOffset = childZOffset;
25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// hitTestLocation and hitTestRect are relative to rootLayer.
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A 'flattening' layer is one preserves3D() == false.
25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// transformState.m_accumulatedTransform holds the transform from the containing flattening layer.
25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the containing flattening layer.
25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of the containing flattening layer.
253602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch//
253702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// If zOffset is non-null (which indicates that the caller wants z offset information),
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  *zOffset on return is the z offset of the hit point relative to the containing flattening layer.
25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, bool appliedTransform,
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       const HitTestingTransformState* transformState, double* zOffset)
25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The natural thing would be to keep HitTestingTransformState on the stack, but it's big, so we heap-allocate.
25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apply a transform if we have one.
25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (transform() && !appliedTransform) {
2550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (enclosingPaginationLayer())
2551926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return hitTestTransformedLayerInFragments(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset);
2552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make sure the parent's clip rects have been calculated.
25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parent()) {
2555197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            ClipRect clipRect = clipper().backgroundClipRect(ClipRectsContext(rootLayer, RootRelativeClipRects, IncludeOverlayScrollbarSize));
25565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Go ahead and test the enclosing clip now.
25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!clipRect.intersects(hitTestLocation))
25585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
25595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return hitTestLayerByApplyingTransform(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset);
25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ensure our lists and 3d status are up-to-date.
2565bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_stackingNode->updateLayerListsIfNeeded();
25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    update3DTransformedDescendantStatus();
25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<HitTestingTransformState> localTransformState;
25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (appliedTransform) {
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We computed the correct state in the caller (above code), so just reference it.
25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(transformState);
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localTransformState = const_cast<HitTestingTransformState*>(transformState);
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (transformState || m_has3DTransformedDescendant || preserves3D()) {
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We need transform state for the first time, or to offset the container state, so create it here.
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localTransformState = createLocalTransformState(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState);
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check for hit test on backface if backface-visibility is 'hidden'
25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (localTransformState && renderer()->style()->backfaceVisibility() == BackfaceVisibilityHidden) {
25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransformationMatrix invertedMatrix = localTransformState->m_accumulatedTransform.inverse();
25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the z-vector of the matrix is negative, the back is facing towards the viewer.
25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (invertedMatrix.m33() < 0)
25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<HitTestingTransformState> unflattenedTransformState = localTransformState;
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (localTransformState && !preserves3D()) {
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Keep a copy of the pre-flattening state, for computing z-offsets for the container
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unflattenedTransformState = HitTestingTransformState::create(*localTransformState);
25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This layer is flattening, so flatten the state passed to descendants.
25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localTransformState->flatten();
25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The following are used for keeping track of the z-depth of the hit point of 3d-transformed
25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // descendants.
2596197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    double localZOffset = -std::numeric_limits<double>::infinity();
25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double* zOffsetForDescendantsPtr = 0;
25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double* zOffsetForContentsPtr = 0;
259902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool depthSortDescendants = false;
26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (preserves3D()) {
26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        depthSortDescendants = true;
26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Our layers can depth-test with our container, so share the z depth pointer with the container, if it passed one down.
26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset;
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset;
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (zOffset) {
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        zOffsetForDescendantsPtr = 0;
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Container needs us to give back a z offset for the hit layer.
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        zOffsetForContentsPtr = zOffset;
26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This variable tracks which layer the mouse ends up being inside.
26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* candidateLayer = 0;
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Begin by walking our list of positive layers from highest z-index down to the lowest z-index.
261651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderLayer* hitLayer = hitTestChildren(PositiveZOrderChildren, rootLayer, request, result, hitTestRect, hitTestLocation,
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hitLayer) {
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!depthSortDescendants)
26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return hitLayer;
26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        candidateLayer = hitLayer;
26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now check our overflow objects.
262551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, hitTestRect, hitTestLocation,
26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hitLayer) {
26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!depthSortDescendants)
26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return hitLayer;
26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        candidateLayer = hitLayer;
26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Collect the fragments. This will compute the clip rectangles for each layer fragment.
2634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerFragments layerFragments;
263509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    collectFragments(layerFragments, rootLayer, hitTestRect, RootRelativeClipRects, IncludeOverlayScrollbarSize);
2636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_scrollableArea && m_scrollableArea->hitTestResizerInFragments(layerFragments, hitTestLocation)) {
2638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        renderer()->updateHitTestResult(result, hitTestLocation.point());
2639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this;
2640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2641926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Next we want to see if the mouse pos is inside the child RenderObjects of the layer. Check
2643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // every fragment in reverse order.
2644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isSelfPaintingLayer()) {
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Hit test with a temporary HitTestResult, because we only want to commit to 'result' if we know we're frontmost.
26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult tempResult(result.hitTestLocation());
2647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool insideFragmentForegroundRect = false;
2648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (hitTestContentsForFragments(layerFragments, request, tempResult, hitTestLocation, HitTestDescendants, insideFragmentForegroundRect)
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (result.isRectBasedTest())
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(tempResult);
26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result = tempResult;
26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!depthSortDescendants)
26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return this;
26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Foreground can depth-sort with descendant layers, so keep this as a candidate.
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            candidateLayer = this;
2658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        } else if (insideFragmentForegroundRect && result.isRectBasedTest())
26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(tempResult);
26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now check our negative z-index children.
266351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    hitLayer = hitTestChildren(NegativeZOrderChildren, rootLayer, request, result, hitTestRect, hitTestLocation,
2664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hitLayer) {
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!depthSortDescendants)
26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return hitLayer;
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        candidateLayer = hitLayer;
26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we found a layer, return. Child layers, and foreground always render in front of background.
26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (candidateLayer)
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return candidateLayer;
26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isSelfPaintingLayer()) {
26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult tempResult(result.hitTestLocation());
2677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool insideFragmentBackgroundRect = false;
2678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (hitTestContentsForFragments(layerFragments, request, tempResult, hitTestLocation, HitTestSelf, insideFragmentBackgroundRect)
26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (result.isRectBasedTest())
26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.append(tempResult);
26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result = tempResult;
26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this;
26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (insideFragmentBackgroundRect && result.isRectBasedTest())
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(tempResult);
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::hitTestContentsForFragments(const LayerFragments& layerFragments, const HitTestRequest& request, HitTestResult& result,
2694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter, bool& insideClipRect) const
2695926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (layerFragments.isEmpty())
2697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
2698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int i = layerFragments.size() - 1; i >= 0; --i) {
2700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = layerFragments.at(i);
2701926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if ((hitTestFilter == HitTestSelf && !fragment.backgroundRect.intersects(hitTestLocation))
2702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            || (hitTestFilter == HitTestDescendants && !fragment.foregroundRect.intersects(hitTestLocation)))
2703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
2704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        insideClipRect = true;
2705926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (hitTestContents(request, result, fragment.layerBounds, hitTestLocation, hitTestFilter))
2706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
2707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
270802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
2710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderLayer* RenderLayer::hitTestTransformedLayerInFragments(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
2713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
2714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2715926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayerFragments enclosingPaginationFragments;
2716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutPoint offsetOfPaginationLayerFromRoot;
2717d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: We're missing a sub-pixel offset here crbug.com/348728
2718d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LayoutRect transformedExtent = transparencyClipBox(this, enclosingPaginationLayer(), HitTestingTransparencyClipBox, RootOfTransparencyClipBox, LayoutSize());
271909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, rootLayer, hitTestRect,
272009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip, &offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent);
2721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) {
2723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const LayerFragment& fragment = enclosingPaginationFragments.at(i);
272402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Apply the page/column clip for this fragment, as well as any clips established by layers in between us and
2726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // the enclosing pagination layer.
2727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutRect clipRect = fragment.backgroundRect.rect();
272802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Now compute the clips within a given fragment
2730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (parent() != enclosingPaginationLayer()) {
2731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            enclosingPaginationLayer()->convertToLayerCoords(rootLayer, offsetOfPaginationLayerFromRoot);
2732197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            LayoutRect parentClipRect = clipper().backgroundClipRect(ClipRectsContext(enclosingPaginationLayer(), RootRelativeClipRects, IncludeOverlayScrollbarSize)).rect();
2733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            parentClipRect.moveBy(fragment.paginationOffset + offsetOfPaginationLayerFromRoot);
2734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            clipRect.intersect(parentClipRect);
2735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
273602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!hitTestLocation.intersects(clipRect))
2738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
2739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderLayer* hitLayer = hitTestLayerByApplyingTransform(rootLayer, containerLayer, request, result, hitTestRect, hitTestLocation,
2741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            transformState, zOffset, fragment.paginationOffset);
2742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (hitLayer)
2743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return hitLayer;
2744926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
274502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
2747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderLayer* RenderLayer::hitTestLayerByApplyingTransform(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
2750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
2751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LayoutPoint& translationOffset)
2752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Create a transform state to accumulate this transform.
2754926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<HitTestingTransformState> newTransformState = createLocalTransformState(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState, translationOffset);
2755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the transform can't be inverted, then don't hit test this layer at all.
2757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!newTransformState->m_accumulatedTransform.isInvertible())
2758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Compute the point and the hit test rect in the coords of this layer by using the values
2761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // from the transformState, which store the point and quad in the coords of the last flattened
2762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // layer, and the accumulated transform which lets up map through preserve-3d layers.
2763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    //
2764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // We can't just map hitTestLocation and hitTestRect because they may have been flattened (losing z)
2765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // by our container.
2766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FloatPoint localPoint = newTransformState->mappedPoint();
2767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    FloatQuad localPointQuad = newTransformState->mappedQuad();
2768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutRect localHitTestRect = newTransformState->boundsOfMappedArea();
2769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestLocation newHitTestLocation;
2770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hitTestLocation.isRectBasedTest())
2771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newHitTestLocation = HitTestLocation(localPoint, localPointQuad);
2772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
2773926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newHitTestLocation = HitTestLocation(localPoint);
2774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Now do a hit test with the root layer shifted to be us.
2776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return hitTestLayer(this, containerLayer, request, result, localHitTestRect, newHitTestLocation, true, newTransformState.get(), zOffset);
2777926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult& result, const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation, HitTestFilter hitTestFilter) const
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant());
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!renderer()->hitTest(request, result, hitTestLocation, toLayoutPoint(layerBounds.location() - renderBoxLocation()), hitTestFilter)) {
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // It's wrong to set innerNode, but then claim that you didn't hit anything, unless it is
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a rect-based test.
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!result.innerNode() || (result.isRectBasedTest() && result.rectBasedTestResult().size()));
27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For positioned generated content, we might still not have a
27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // node by the time we get to the layer level, since none of
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the content in the layer has an element. So just walk up
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the tree.
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!result.innerNode() || !result.innerNonSharedNode()) {
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* e = enclosingElement();
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!result.innerNode())
27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.setInnerNode(e);
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!result.innerNonSharedNode())
27995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.setInnerNonSharedNode(e);
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
280102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
280551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)RenderLayer* RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, RenderLayer* rootLayer,
280651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const HitTestRequest& request, HitTestResult& result,
280751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
280851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const HitTestingTransformState* transformState,
280951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    double* zOffsetForDescendants, double* zOffset,
281051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const HitTestingTransformState* unflattenedTransformState,
281151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool depthSortDescendants)
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasSelfPaintingLayerDescendant())
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayer* resultLayer = 0;
281751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderLayerStackingNodeReverseIterator iterator(*m_stackingNode, childrentoVisit);
281851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (RenderLayerStackingNode* child = iterator.next()) {
281951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        RenderLayer* childLayer = child->layer();
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderLayer* hitLayer = 0;
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HitTestResult tempResult(result.hitTestLocation());
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (childLayer->isPaginated())
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, request, tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendants);
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            hitLayer = childLayer->hitTestLayer(rootLayer, this, request, tempResult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants);
28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If it a rect-based test, we can safely append the temporary result since it might had hit
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // nodes but not necesserily had hitLayer set.
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (result.isRectBasedTest())
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.append(tempResult);
28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedTransformState)) {
28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resultLayer = hitLayer;
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!result.isRectBasedTest())
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result = tempResult;
28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!depthSortDescendants)
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resultLayer;
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::hitTestPaginatedChildLayer(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result,
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                     const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset)
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RenderLayer*> columnLayers;
2848d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode();
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent()) {
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagination(childLayer->renderer(), curr->renderBox()))
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            columnLayers.append(curr);
2852f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (curr->stackingNode() == ancestorNode)
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(columnLayers.size());
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitTestRect, hitTestLocation, transformState, zOffset,
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                    columnLayers, columnLayers.size() - 1);
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderLayer* RenderLayer::hitTestChildLayerColumns(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result,
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                   const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset,
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                   const Vector<RenderLayer*>& columnLayers, size_t columnIndex)
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBlock* columnBlock = toRenderBlock(columnLayers[columnIndex]->renderer());
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(columnBlock && columnBlock->hasColumns());
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!columnBlock || !columnBlock->hasColumns())
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint layerOffset;
28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    columnBlock->layer()->convertToLayerCoords(rootLayer, layerOffset);
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ColumnInfo* colInfo = columnBlock->columnInfo();
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int colCount = columnBlock->columnCount(colInfo);
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We have to go backwards from the last column to the first.
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isHorizontal = columnBlock->style()->isHorizontalWritingMode();
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalLeft = columnBlock->logicalLeftOffsetForContent();
28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit currLogicalTopOffset = 0;
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int i;
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < colCount; i++) {
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect colRect = columnBlock->columnRectAt(colInfo, i);
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit blockDelta =  (isHorizontal ? colRect.height() : colRect.width());
28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (columnBlock->style()->isFlippedBlocksWritingMode())
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset += blockDelta;
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset -= blockDelta;
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = colCount - 1; i >= 0; i--) {
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For each rect, we clip to the rect, and then we adjust our coords.
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect colRect = columnBlock->columnRectAt(colInfo, i);
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        columnBlock->flipForWritingMode(colRect);
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit currLogicalLeftOffset = (isHorizontal ? colRect.x() : colRect.y()) - logicalLeft;
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit blockDelta =  (isHorizontal ? colRect.height() : colRect.width());
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (columnBlock->style()->isFlippedBlocksWritingMode())
28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset -= blockDelta;
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currLogicalTopOffset += blockDelta;
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutSize offset;
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHorizontal) {
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(currLogicalLeftOffset, currLogicalTopOffset);
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(0, colRect.y() + currLogicalTopOffset - columnBlock->borderTop() - columnBlock->paddingTop());
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (colInfo->progressionAxis() == ColumnInfo::InlineAxis)
29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(currLogicalTopOffset, currLogicalLeftOffset);
29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnBlock->borderLeft() - columnBlock->paddingLeft(), 0);
29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        colRect.moveBy(layerOffset);
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect localClipRect(hitTestRect);
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        localClipRect.intersect(colRect);
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!localClipRect.isEmpty() && hitTestLocation.intersects(localClipRect)) {
29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderLayer* hitLayer = 0;
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!columnIndex) {
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Apply a translation transform to change where the layer paints.
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TransformationMatrix oldTransform;
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bool oldHasTransform = childLayer->transform();
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (oldHasTransform)
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    oldTransform = *childLayer->transform();
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TransformationMatrix newTransform(oldTransform);
29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newTransform.translateRight(offset.width(), offset.height());
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                childLayer->m_transform = adoptPtr(new TransformationMatrix(newTransform));
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], request, result, localClipRect, hitTestLocation, false, transformState, zOffset);
29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (oldHasTransform)
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    childLayer->m_transform = adoptPtr(new TransformationMatrix(oldTransform));
29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    childLayer->m_transform.clear();
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Adjust the transform such that the renderer's upper left corner will be at (0,0) in user space.
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // This involves subtracting out the position of the layer in our current coordinate space.
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                RenderLayer* nextLayer = columnLayers[columnIndex - 1];
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                RefPtr<HitTestingTransformState> newTransformState = nextLayer->createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState);
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newTransformState->translate(offset.width(), offset.height(), HitTestingTransformState::AccumulateTransform);
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                FloatPoint localPoint = newTransformState->mappedPoint();
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                FloatQuad localPointQuad = newTransformState->mappedQuad();
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                LayoutRect localHitTestRect = newTransformState->mappedArea().enclosingBoundingBox();
29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                HitTestLocation newHitTestLocation;
29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (hitTestLocation.isRectBasedTest())
29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    newHitTestLocation = HitTestLocation(localPoint, localPointQuad);
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    newHitTestLocation = HitTestLocation(localPoint);
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                newTransformState->flatten();
29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[columnIndex - 1], request, result, localHitTestRect, newHitTestLocation,
29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                    newTransformState.get(), zOffset, columnLayers, columnIndex - 1);
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (hitLayer)
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return hitLayer;
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void RenderLayer::blockSelectionGapsBoundsChanged()
29655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
29665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setNeedsCompositingInputsUpdate();
29675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
29685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::addBlockSelectionGapsBounds(const LayoutRect& bounds)
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_blockSelectionGapsBounds.unite(enclosingIntRect(bounds));
29725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    blockSelectionGapsBoundsChanged();
29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::clearBlockSelectionGapsBounds()
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_blockSelectionGapsBounds = IntRect();
29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child->clearBlockSelectionGapsBounds();
29805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    blockSelectionGapsBoundsChanged();
29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2983197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::invalidatePaintForBlockSelectionGaps()
29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
29855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
2986197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        child->invalidatePaintForBlockSelectionGaps();
29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_blockSelectionGapsBounds.isEmpty())
29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect rect = m_blockSelectionGapsBounds;
2992bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (renderer()->hasOverflowClip()) {
2993bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        RenderBox* box = renderBox();
2994bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        rect.move(-box->scrolledContentOffset());
2995f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (!scrollableArea()->usesCompositedScrolling())
299609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            rect.intersect(box->overflowClipRect(LayoutPoint()));
2997bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()->hasClip())
299909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        rect.intersect(toRenderBox(renderer())->clipRect(LayoutPoint()));
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rect.isEmpty())
30015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        renderer()->invalidatePaintRectangle(rect);
30025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
30035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)IntRect RenderLayer::blockSelectionGapsBounds() const
30055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
30065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!renderer()->isRenderBlock())
30075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return IntRect();
30085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RenderBlock* renderBlock = toRenderBlock(renderer());
30109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutRect gapRects = renderBlock->selectionGapRectsForPaintInvalidation(renderBlock);
30115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return pixelSnappedIntRect(gapRects);
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)bool RenderLayer::hasBlockSelectionGapBounds() const
3016f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
30175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME: it would be more accurate to return !blockSelectionGapsBounds().isEmpty(), but this is impossible
30185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // at the moment because it causes invalid queries to layout-dependent code (crbug.com/372802).
30195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // ASSERT(renderer()->document().lifecycle().state() >= DocumentLifecycle::LayoutClean);
30205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!renderer()->isRenderBlock())
30225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return false;
30235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return toRenderBlock(renderer())->shouldPaintSelectionGaps();
3025f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
3026f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
3027926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot) const
30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Always examine the canvas and the root.
30306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // FIXME: Could eliminate the isDocumentElement() check if we fix background painting so that the RenderView
30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // paints the root's background.
30326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (isRootLayer() || renderer()->isDocumentElement())
30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
303502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // If we aren't an inline flow, and our layer bounds do intersect the damage rect, then we
30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // can go ahead and return true.
30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderView* view = renderer()->view();
30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(view);
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (view && !renderer()->isRenderInline()) {
304007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (layerBounds.intersects(damageRect))
30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
304302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise we need to compute the bounding box of this single layer and see if it intersects
30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the damage rect.
3046a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return physicalBoundingBox(rootLayer, offsetFromRoot).intersects(damageRect);
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3049a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochLayoutRect RenderLayer::logicalBoundingBox() const
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There are three special cases we need to consider.
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // (1) Inline Flows.  For inline flows we will create a bounding box that fully encompasses all of the lines occupied by the
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // inline.  In other words, if some <span> wraps to three lines, we'll create a bounding box that fully encloses the
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // line boxes of all three lines (including overflow on those lines).
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // (2) Left/Top Overflow.  The width/height of layers already includes right/bottom overflow.  However, in the case of left/top
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // overflow, we have to create a bounding box that will extend to include this overflow.
30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // (3) Floats.  When a layer has overhanging floats that it paints, we need to make sure to include these overhanging floats
30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // as part of our bounding box.  We do this because we are the responsible layer for both hit testing and painting those
30595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // floats.
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect result;
3061a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (renderer()->isInline() && renderer()->isRenderInline()) {
30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = toRenderInline(renderer())->linesVisualOverflowBoundingBox();
3063a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    } else if (renderer()->isTableRow()) {
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Our bounding box is just the union of all of our cells' border/overflow rects.
3065d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        for (RenderObject* child = renderer()->slowFirstChild(); child; child = child->nextSibling()) {
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (child->isTableCell()) {
30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                LayoutRect bbox = toRenderBox(child)->borderBoxRect();
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.unite(bbox);
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                LayoutRect overflowRect = renderBox()->visualOverflowRect();
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (bbox != overflowRect)
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    result.unite(overflowRect);
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderBox* box = renderBox();
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(box);
3077a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        result = box->borderBoxRect();
3078a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        result.unite(box->visualOverflowRect());
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
308107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(renderer()->view());
30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
30845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochLayoutRect RenderLayer::physicalBoundingBox(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot) const
308602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
3087a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutRect result = logicalBoundingBox();
3088a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_renderer->isBox())
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderBox()->flipForWritingMode(result);
30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3091a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_renderer->containingBlock()->flipForWritingMode(result);
3092926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutPoint delta;
3094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (offsetFromRoot)
3095926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delta = *offsetFromRoot;
3096926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
3097926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        convertToLayerCoords(ancestorLayer, delta);
309802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.moveBy(delta);
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3103197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic void expandRectForReflectionAndStackingChildren(const RenderLayer* ancestorLayer, RenderLayer::CalculateBoundsOptions options, LayoutRect& result)
31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (ancestorLayer->reflectionInfo() && !ancestorLayer->reflectionInfo()->reflectionLayer()->hasCompositedLayerMapping())
3106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        result.unite(ancestorLayer->reflectionInfo()->reflectionLayer()->boundingBoxForCompositing(ancestorLayer));
31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(ancestorLayer->stackingNode()->isStackingContext() || !ancestorLayer->stackingNode()->hasPositiveZOrderList());
3109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
3111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    LayerListMutationDetector mutationChecker(const_cast<RenderLayer*>(ancestorLayer)->stackingNode());
3112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#endif
3113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3114f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RenderLayerStackingNodeIterator iterator(*ancestorLayer->stackingNode(), AllChildren);
3115f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    while (RenderLayerStackingNode* node = iterator.next()) {
3116f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // Here we exclude both directly composited layers and squashing layers
3117f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // because those RenderLayers don't paint into the graphics layer
3118f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // for this RenderLayer. For example, the bounds of squashed RenderLayers
3119f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // will be included in the computation of the appropriate squashing
3120f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // GraphicsLayer.
3121f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (options != RenderLayer::ApplyBoundsChickenEggHacks && node->layer()->compositingState() != NotComposited)
3122f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            continue;
3123f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        result.unite(node->layer()->boundingBoxForCompositing(ancestorLayer, options));
3124f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    }
3125f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
3126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
3127197021e6b966cfb06891637935ef33fff06433d1Ben MurdochLayoutRect RenderLayer::physicalBoundingBoxIncludingReflectionAndStackingChildren(const RenderLayer* ancestorLayer, const LayoutPoint& offsetFromRoot) const
3128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
3129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    LayoutPoint origin;
3130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    LayoutRect result = physicalBoundingBox(ancestorLayer, &origin);
3131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded();
3133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    expandRectForReflectionAndStackingChildren(this, DoNotApplyBoundsChickenEggHacks, result);
3135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    result.moveBy(offsetFromRoot);
3137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return result;
3138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
3139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3140a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochLayoutRect RenderLayer::boundingBoxForCompositing(const RenderLayer* ancestorLayer, CalculateBoundsOptions options) const
3141a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
3142a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!isSelfPaintingLayer())
3143a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return LayoutRect();
31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!ancestorLayer)
3146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        ancestorLayer = this;
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3148a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // FIXME: This could be improved to do a check like hasVisibleNonCompositingDescendantLayers() (bug 92580).
3149a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (this != ancestorLayer && !hasVisibleContent() && !hasVisibleDescendant())
3150a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return LayoutRect();
3151a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
3152a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // The root layer is always just the size of the document.
3153a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (isRootLayer())
3154a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return m_renderer->view()->unscaledDocumentRect();
3155a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
3156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const bool shouldIncludeTransform = paintsWithTransform(PaintBehaviorNormal) || (options == ApplyBoundsChickenEggHacks && transform());
3157a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
3158a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutRect localClipRect = clipper().localClipRect();
3159a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (localClipRect != PaintInfo::infiniteRect()) {
3160a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (shouldIncludeTransform)
3161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            localClipRect = transform()->mapRect(localClipRect);
3162a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
3163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        LayoutPoint delta;
3164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        convertToLayerCoords(ancestorLayer, delta);
3165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        localClipRect.moveBy(delta);
3166a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return localClipRect;
31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutPoint origin;
3170a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutRect result = physicalBoundingBox(ancestorLayer, &origin);
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3172bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded();
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3174f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // Reflections are implemented with RenderLayers that hang off of the reflected layer. However,
3175f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // the reflection layer subtree does not include the subtree of the parent RenderLayer, so
3176f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // a recursive computation of stacking children yields no results. This breaks cases when there are stacking
3177f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // children of the parent, that need to be included in reflected composited bounds.
3178f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // Fix this by including composited bounds of stacking children of the reflected RenderLayer.
3179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (hasCompositedLayerMapping() && parent() && parent()->reflectionInfo() && parent()->reflectionInfo()->reflectionLayer() == this)
3180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        expandRectForReflectionAndStackingChildren(parent(), options, result);
3181f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    else
3182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        expandRectForReflectionAndStackingChildren(this, options, result);
318353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We can optimize the size of the composited layers, by not enlarging
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // filtered areas with the outsets if we know that the filter is going to render in hardware.
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // https://bugs.webkit.org/show_bug.cgi?id=81239
3187a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_renderer->style()->filterOutsets().expandRect(result);
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3189a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (shouldIncludeTransform)
3190a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        result = transform()->mapRect(result);
319102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3192a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    LayoutPoint delta;
3193a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    convertToLayerCoords(ancestorLayer, delta);
3194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    result.moveBy(delta);
3195a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return result;
31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3198bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)CompositingState RenderLayer::compositingState() const
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
320009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(isAllowedToQueryCompositingState());
320109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3202bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // This is computed procedurally so there is no redundant state variable that
3203bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // can get out of sync from the real actual compositing state.
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
320509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_groupedMapping) {
320609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(compositor()->layerSquashingEnabled());
320709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(!m_compositedLayerMapping);
320809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return PaintsIntoGroupedBacking;
320909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
321009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3211bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!m_compositedLayerMapping)
3212bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return NotComposited;
321302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (compositedLayerMapping()->paintsIntoCompositedAncestor())
3215bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return HasOwnBackingButPaintsIntoAncestor;
32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3217bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return PaintsIntoOwnBacking;
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
322009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderLayer::isAllowedToQueryCompositingState() const
322109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
322209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (gCompositingQueryMode == CompositingQueriesAreAllowed)
322309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return true;
322409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return renderer()->document().lifecycle().state() >= DocumentLifecycle::InCompositingUpdate;
322509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
322609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)CompositedLayerMapping* RenderLayer::compositedLayerMapping() const
3228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(isAllowedToQueryCompositingState());
3230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_compositedLayerMapping.get();
3231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3233197021e6b966cfb06891637935ef33fff06433d1Ben MurdochGraphicsLayer* RenderLayer::graphicsLayerBacking() const
3234197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
3235197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    switch (compositingState()) {
3236197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case NotComposited:
3237197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return 0;
3238197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case PaintsIntoGroupedBacking:
3239197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return groupedMapping()->squashingLayer();
3240197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    default:
3241197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return compositedLayerMapping()->mainGraphicsLayer();
3242197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
3243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
3244197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3245197021e6b966cfb06891637935ef33fff06433d1Ben MurdochGraphicsLayer* RenderLayer::graphicsLayerBackingForScrolling() const
3246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
3247197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    switch (compositingState()) {
3248197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case NotComposited:
3249197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return 0;
3250197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case PaintsIntoGroupedBacking:
3251197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return groupedMapping()->squashingLayer();
3252197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    default:
3253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return compositedLayerMapping()->scrollingContentsLayer() ? compositedLayerMapping()->scrollingContentsLayer() : compositedLayerMapping()->mainGraphicsLayer();
3254197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
3255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
3256197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3257e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)CompositedLayerMapping* RenderLayer::ensureCompositedLayerMapping()
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!m_compositedLayerMapping) {
3260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_compositedLayerMapping = adoptPtr(new CompositedLayerMapping(*this));
326176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree);
32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateOrRemoveFilterEffectRenderer();
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_compositedLayerMapping.get();
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void RenderLayer::clearCompositedLayerMapping(bool layerBeingDestroyed)
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!layerBeingDestroyed) {
3271d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // We need to make sure our decendants get a geometry update. In principle,
327207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // we could call setNeedsGraphicsLayerUpdate on our children, but that would
3273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // require walking the z-order lists to find them. Instead, we over-invalidate
3274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        // by marking our parent as needing a geometry update.
3275197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (RenderLayer* compositingParent = enclosingLayerWithCompositedLayerMapping(ExcludeSelf))
327676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree);
3277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
3278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
32791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_compositedLayerMapping.clear();
32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!layerBeingDestroyed)
32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateOrRemoveFilterEffectRenderer();
32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void RenderLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping, bool layerBeingDestroyed)
3286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
3287f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (groupedMapping == m_groupedMapping)
3288f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return;
3289f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
3290f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!layerBeingDestroyed && m_groupedMapping) {
329176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree);
3292f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        m_groupedMapping->removeRenderLayerFromSquashingGraphicsLayer(this);
3293f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
3294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_groupedMapping = groupedMapping;
3295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!layerBeingDestroyed && m_groupedMapping)
329676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        m_groupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtree);
3297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
3298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::hasCompositedMask() const
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_compositedLayerMapping && m_compositedLayerMapping->hasMaskLayer();
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
330406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)bool RenderLayer::hasCompositedClippingMask() const
330506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
33061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_compositedLayerMapping && m_compositedLayerMapping->hasChildClippingMaskLayer();
33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
330909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderLayer::clipsCompositingDescendantsWithBorderRadius() const
331009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
331109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RenderStyle* style = renderer()->style();
331209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!style)
331309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
331409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
331509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return compositor()->clipsCompositingDescendants(this) && style->hasBorderRadius();
331609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
331709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::paintsWithTransform(PaintBehavior paintBehavior) const
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3320bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return transform() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || compositingState() != PaintsIntoOwnBacking);
33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
332309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderLayer::paintsWithBlendMode() const
332409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
3325e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_renderer->hasBlendMode() && compositingState() != PaintsIntoOwnBacking;
332609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
332709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
3329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
3331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (paintsWithTransparency(PaintBehaviorNormal))
3334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
33365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // We can't use hasVisibleContent(), because that will be true if our renderer is hidden, but some child
33375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // is visible and that child doesn't cover the entire rect.
33385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (renderer()->style()->visibility() != VISIBLE)
33395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return false;
33405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
334153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (paintsWithFilters() && renderer()->style()->filter().hasFilterThatAffectsOpacity())
334253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
334353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: Handle simple transforms.
3345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (paintsWithTransform(PaintBehaviorNormal))
3346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: Remove this check.
3349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This function should not be called when layer-lists are dirty.
3350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // It is somehow getting triggered during style update.
3351bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_stackingNode->zOrderListsDirty() || m_stackingNode->normalFlowListDirty())
3352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: We currently only check the immediate renderer,
3355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // which will miss many cases.
33565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (renderer()->backgroundIsKnownToBeOpaqueInRect(localRect))
33575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return true;
33585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
33595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // We can't consult child layers if we clip, since they might cover
33605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // parts of the rect that are clipped out.
33615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (renderer()->hasOverflowClip())
33625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return false;
33635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
336451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return childBackgroundIsKnownToBeOpaqueInRect(localRect);
3365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
336751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool RenderLayer::childBackgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) const
3368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
336951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderLayerStackingNodeReverseIterator revertseIterator(*m_stackingNode, PositiveZOrderChildren | NormalFlowChildren | NegativeZOrderChildren);
337051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (RenderLayerStackingNode* child = revertseIterator.next()) {
337151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        const RenderLayer* childLayer = child->layer();
3372197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // Stop at composited paint boundaries.
3373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (childLayer->isPaintInvalidationContainer())
3374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
3375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!childLayer->canUseConvertToLayerCoords())
3377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            continue;
3378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutPoint childOffset;
3380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LayoutRect childLocalRect(localRect);
3381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        childLayer->convertToLayerCoords(this, childOffset);
3382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        childLocalRect.moveBy(-childOffset);
3383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (childLayer->backgroundIsKnownToBeOpaqueInRect(childLocalRect))
3385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
3386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
3387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
3388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderLayer::shouldBeSelfPaintingLayer() const
33915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3392f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (renderer()->isRenderPart() && toRenderPart(renderer())->requiresAcceleratedCompositing())
3393f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return true;
3394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_layerType == NormalLayer
3395bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        || (m_scrollableArea && m_scrollableArea->hasOverlayScrollbars())
339609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        || needsCompositedScrolling();
33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::updateSelfPaintingLayer()
34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3401e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool isSelfPaintingLayer = shouldBeSelfPaintingLayer();
340251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (this->isSelfPaintingLayer() == isSelfPaintingLayer)
34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isSelfPaintingLayer = isSelfPaintingLayer;
3406e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
3407e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (parent())
34085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::hasNonEmptyChildRenderers() const
3412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Some HTML can cause whitespace text nodes to have renderers, like:
3414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // <div>
3415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // <img src=...>
3416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // </div>
3417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // so test for 0x0 RenderTexts here
3418d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (RenderObject* child = renderer()->slowFirstChild(); child; child = child->nextSibling()) {
3419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!child->hasLayer()) {
3420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (child->isRenderInline() || !child->isBox())
3421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return true;
342202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (toRenderBox(child)->width() > 0 || toRenderBox(child)->height() > 0)
3424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return true;
3425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
3426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
3427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
3428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::hasBoxDecorationsOrBackground() const
3431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3432197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasBackground();
3433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::hasVisibleBoxDecorations() const
3436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!hasVisibleContent())
3438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return hasBoxDecorationsOrBackground() || hasOverflowControls();
3441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderLayer::isVisuallyNonEmpty() const
3444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
3445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_visibleDescendantStatusDirty);
3446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasVisibleContent() && hasNonEmptyChildRenderers())
3448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
3449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderer()->isReplaced() || renderer()->hasMask())
3451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
3452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasVisibleBoxDecorations())
3454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
3455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
3457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
3458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
345953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle* newStyle)
346053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
3461197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter()))
346253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
346353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
346453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateOrRemoveFilterClients();
346553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    updateOrRemoveFilterEffectRenderer();
346653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
346753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3468197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool RenderLayer::attemptDirectCompositingUpdate(StyleDifference diff, const RenderStyle* oldStyle)
3469197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
3470197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    CompositingReasons oldPotentialCompositingReasonsFromStyle = m_potentialCompositingReasonsFromStyle;
3471197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    compositor()->updatePotentialCompositingReasonsFromStyle(this);
3472197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3473197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // This function implements an optimization for transforms and opacity.
3474197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // A common pattern is for a touchmove handler to update the transform
3475197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // and/or an opacity of an element every frame while the user moves their
3476197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // finger across the screen. The conditions below recognize when the
3477197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // compositing state is set up to receive a direct transform or opacity
3478197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // update.
3479197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3480197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!diff.hasAtMostPropertySpecificDifferences(StyleDifference::TransformChanged | StyleDifference::OpacityChanged))
3481197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3482197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // The potentialCompositingReasonsFromStyle could have changed without
3483197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // a corresponding StyleDifference if an animation started or ended.
3484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_potentialCompositingReasonsFromStyle != oldPotentialCompositingReasonsFromStyle)
3485197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3486197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // We could add support for reflections if we updated the transform on
3487197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // the reflection layers.
3488197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (renderer()->hasReflection())
3489197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3490197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // If we're unwinding a scheduleSVGFilterLayerUpdateHack(), then we can't
3491197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // perform a direct compositing update because the filters code is going
3492197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // to produce different output this time around. We can remove this code
3493197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // once we fix the chicken/egg bugs in the filters code and delete the
3494197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // scheduleSVGFilterLayerUpdateHack().
3495197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (renderer()->node() && renderer()->node()->svgFilterNeedsLayerUpdate())
3496197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3497197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!m_compositedLayerMapping)
3498197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3499197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3500197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // To cut off almost all the work in the compositing update for
3501197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // this case, we treat inline transforms has having assumed overlap
3502197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // (similar to how we treat animated transforms). Notice that we read
3503197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // CompositingReasonInlineTransform from the m_compositingReasons, which
3504197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // means that the inline transform actually triggered assumed overlap in
3505197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // the overlap map.
3506197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (diff.transformChanged() && !(m_compositingReasons & CompositingReasonInlineTransform))
3507197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3508197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3509197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // We composite transparent RenderLayers differently from non-transparent
3510197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // RenderLayers even when the non-transparent RenderLayers are already a
3511197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // stacking context.
3512197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (diff.opacityChanged() && m_renderer->style()->hasOpacity() != oldStyle->hasOpacity())
3513197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
3514197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3515197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateTransform(oldStyle, renderer()->style());
3516197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3517197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: Consider introducing a smaller graphics layer update scope
3518197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // that just handles transforms and opacity. GraphicsLayerUpdateLocal
3519197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // will also program bounds, clips, and many other properties that could
3520197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // not possibly have changed.
3521197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateLocal);
3522197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    compositor()->setNeedsCompositingUpdate(CompositingUpdateAfterGeometryChange);
3523197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
3524197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
3525197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
352609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle)
352753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
3528197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (attemptDirectCompositingUpdate(diff, oldStyle))
3529197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
3530197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3531bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_stackingNode->updateIsNormalFlowOnly();
3532aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle);
353353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
35341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_scrollableArea)
35351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_scrollableArea->updateAfterStyleChange(oldStyle);
353609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Overlay scrollbars can make this layer self-painting so we need
35385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to recompute the bit once scrollbars have been updated.
35395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateSelfPaintingLayer();
35405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
354109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle)) {
354210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        ASSERT(!oldStyle || diff.needsFullLayout());
354309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        updateReflectionInfo(oldStyle);
354409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
354502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3546bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    updateDescendantDependentFlags();
354709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
354876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    updateTransform(oldStyle, renderer()->style());
3549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateFilters(oldStyle, renderer()->style());
355007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
35515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setNeedsCompositingInputsUpdate();
355281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
355381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
3554bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool RenderLayer::scrollsOverflow() const
3555bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
3556f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (RenderLayerScrollableArea* scrollableArea = this->scrollableArea())
3557f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return scrollableArea->scrollsOverflow();
3558bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3559f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return false;
35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FilterOperations RenderLayer::computeFilterOperations(const RenderStyle* style)
35635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const FilterOperations& filters = style->filter();
3565e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (filters.hasReferenceFilter()) {
3566e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        for (size_t i = 0; i < filters.size(); ++i) {
3567e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            FilterOperation* filterOperation = filters.operations().at(i).get();
356851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (filterOperation->type() != FilterOperation::REFERENCE)
3569e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                continue;
357051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            ReferenceFilterOperation* referenceOperation = toReferenceFilterOperation(filterOperation);
3571e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // FIXME: Cache the ReferenceFilter if it didn't change.
3572e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            RefPtr<ReferenceFilter> referenceFilter = ReferenceFilter::create();
3573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            float zoom = style->effectiveZoom();
357409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            referenceFilter->setAbsoluteTransform(AffineTransform().scale(zoom, zoom));
3575e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            referenceFilter->setLastEffect(ReferenceFilterBuilder::build(referenceFilter.get(), renderer(), referenceFilter->sourceGraphic(),
3576e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                referenceOperation));
3577e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            referenceOperation->setFilter(referenceFilter.release());
3578e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
3579e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
3580e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
358109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return filters;
35825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::updateOrRemoveFilterClients()
35855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasFilter()) {
35875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeFilterInfoIfNeeded();
35885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
35895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
35905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()->style()->filter().hasReferenceFilter())
35925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->filter());
35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (hasFilterInfo())
35945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        filterInfo()->removeReferenceFilterClients();
35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderLayer::updateOrRemoveFilterEffectRenderer()
35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FilterEffectRenderer is only used to render the filters in software mode,
36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so we always need to run updateOrRemoveFilterEffectRenderer after the composited
36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // mode might have changed for this layer.
36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!paintsWithFilters()) {
36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Don't delete the whole filter info here, because we might use it
36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // for loading CSS shader files.
36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderLayerFilterInfo* filterInfo = this->filterInfo())
3606d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            filterInfo->setRenderer(nullptr);
36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3608e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
361002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderLayerFilterInfo* filterInfo = ensureFilterInfo();
36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!filterInfo->renderer()) {
36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<FilterEffectRenderer> filterRenderer = FilterEffectRenderer::create();
36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        filterInfo->setRenderer(filterRenderer.release());
36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
36165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the filter fails to build, remove it from the layer. It will still attempt to
36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // go through regular processing (e.g. compositing), but never apply anything.
3619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!filterInfo->renderer()->build(renderer(), computeFilterOperations(renderer()->style())))
3620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        filterInfo->setRenderer(nullptr);
36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
36225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3623197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderLayer::filterNeedsPaintInvalidation()
36245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
362509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
362609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        DeprecatedScheduleStyleRecalcDuringLayout marker(renderer()->document().lifecycle());
3627f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // It's possible for scheduleSVGFilterLayerUpdateHack to schedule a style recalc, which
362809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // is a problem because this function can be called while performing layout.
362909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Presumably this represents an illegal data flow of layout or compositing
363009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // information into the style system.
3631f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        toElement(renderer()->node())->scheduleSVGFilterLayerUpdateHack();
363209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
363309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    renderer()->setShouldDoFullPaintInvalidation(true);
36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
36365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid RenderLayer::addLayerHitTestRects(LayerHitTestRects& rects) const
36383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{
363909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    computeSelfHitTestRects(rects);
364009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
364109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        child->addLayerHitTestRects(rects);
364209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
364309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
364409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderLayer::computeSelfHitTestRects(LayerHitTestRects& rects) const
364509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
36463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (!size().isEmpty()) {
36473c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        Vector<LayoutRect> rect;
36483c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
36493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        if (renderBox() && renderBox()->scrollsOverflow()) {
36503c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            // For scrolling layers, rects are taken to be in the space of the contents.
365109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // We need to include the bounding box of the layer in the space of its parent
365209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // (eg. for border / scroll bars) and if it's composited then the entire contents
365309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // as well as they may be on another composited layer. Skip reporting contents
365409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // for non-composited layers as they'll get projected to the same layer as the
365509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // bounding box.
365609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (compositingState() != NotComposited)
365709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                rect.append(m_scrollableArea->overflowRect());
365809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            rects.set(this, rect);
36603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (const RenderLayer* parentLayer = parent()) {
36613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch                LayerHitTestRects::iterator iter = rects.find(parentLayer);
366209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                if (iter == rects.end()) {
3663a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    rects.add(parentLayer, Vector<LayoutRect>()).storedValue->value.append(physicalBoundingBox(parentLayer));
366409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                } else {
3665a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    iter->value.append(physicalBoundingBox(parentLayer));
366609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                }
36673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            }
36683c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        } else {
3669a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            rect.append(logicalBoundingBox());
36703c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            rects.set(this, rect);
36713c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        }
36723c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    }
36733c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch}
36743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
3675e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderLayer::setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants()
3676e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
3677e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    renderer()->setShouldDoFullPaintInvalidation(true);
3678e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
3679e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Disable for reading compositingState() in isPaintInvalidationContainer() below.
3680e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    DisableCompositingQueryAsserts disabler;
3681e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
3682e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
3683e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!child->isPaintInvalidationContainer())
3684e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            child->setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants();
3685e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
3686e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
3687e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
368809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)DisableCompositingQueryAsserts::DisableCompositingQueryAsserts()
368909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : m_disabler(gCompositingQueryMode, CompositingQueriesAreAllowed) { }
369009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3691c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3694c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showLayerTree(const blink::RenderLayer* layer)
36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
36965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!layer)
36975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3699c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (blink::LocalFrame* frame = layer->renderer()->frame()) {
3700c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        WTF::String output = externalRepresentation(frame, blink::RenderAsTextShowAllLayers | blink::RenderAsTextShowLayerNesting | blink::RenderAsTextShowCompositedLayers | blink::RenderAsTextShowAddresses | blink::RenderAsTextShowIDAndClass | blink::RenderAsTextDontUpdateLayout | blink::RenderAsTextShowLayoutState);
37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "%s\n", output.utf8().data());
37025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showLayerTree(const blink::RenderObject* renderer)
37065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showLayerTree(renderer->enclosingLayer());
37105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
37115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3712