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