/* * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved. * Copyright (C) 2013 Intel Corporation. All rights reserved. * * Portions are Copyright (C) 1998 Netscape Communications Corporation. * * Other contributors: * Robert O'Callahan <[email protected]> * David Baron <[email protected]> * Christian Biesinger <[email protected]> * Randall Jesup <[email protected]> * Roland Mainz <[email protected]> * Josh Soref <[email protected]> * Boris Zbarsky <[email protected]> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * * Alternatively, the contents of this file may be used under the terms * of either the Mozilla Public License Version 1.1, found at * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html * (the "GPL"), in which case the provisions of the MPL or the GPL are * applicable instead of those above. If you wish to allow use of your * version of this file only under the terms of one of those two * licenses (the MPL or the GPL) and not to allow others to use your * version of this file under the LGPL, indicate your decision by * deletingthe provisions above and replace them with the notice and * other provisions required by the MPL or the GPL, as the case may be. * If you do not delete the provisions above, a recipient may use your * version of this file under any of the LGPL, the MPL or the GPL. */ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_PAINT_LAYER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_PAINT_LAYER_H_ #include <memory> #include "base/auto_reset.h" #include "base/dcheck_is_on.h" #include "base/gtest_prod_util.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/static_position.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/paint/paint_layer_clipper.h" #include "third_party/blink/renderer/core/paint/paint_layer_fragment.h" #include "third_party/blink/renderer/core/paint/paint_layer_resource_info.h" #include "third_party/blink/renderer/core/paint/paint_layer_stacking_node.h" #include "third_party/blink/renderer/core/paint/paint_result.h" #include "third_party/blink/renderer/platform/graphics/overlay_scrollbar_clip_behavior.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" namespace blink { class CompositorFilterOperations; class ComputedStyle; class FilterEffect; class FilterOperations; class HitTestResult; class HitTestingTransformState; class PaintLayerScrollableArea; enum IncludeSelfOrNot { … }; // Used in PaintLayerPaintOrderIterator. enum PaintLayerIteration { … }; // TODO(crbug.com/332933527): Support anchors-valid. // If the size of this enum changes, make sure to update the bits needed for // `invisible_for_position_visibility_`. enum class LayerPositionVisibility : uint8_t { … }; // PaintLayer is an old object that handles lots of unrelated operations. // // We want it to die at some point and be replaced by more focused objects, // which would remove (or at least compartmentalize) a lot of complexity. // See the STATUS OF PAINTLAYER section below. // // The class is central to painting and hit-testing. That's because it handles // a lot of tasks (we included ones done by associated satellite objects for // historical reasons): // - Complex painting operations (opacity, clipping, filters, reflections, ...). // - hardware acceleration (through PaintLayerCompositor). // - scrolling (through PaintLayerScrollableArea). // - some performance optimizations. // // The compositing code is also based on PaintLayer. The entry to it is the // PaintLayerCompositor, which fills |composited_layer_mapping| for hardware // accelerated layers. // // TODO(jchaffraix): Expand the documentation about hardware acceleration. // // // ***** SELF-PAINTING LAYER ***** // One important concept about PaintLayer is "self-painting" // (is_self_painting_layer_). // PaintLayer started as the implementation of a stacking context. This meant // that we had to use PaintLayer's painting order (the code is now in // PaintLayerPainter and PaintLayerStackingNode) instead of the LayoutObject's // children order. Over the years, as more operations were handled by // PaintLayer, some LayoutObjects that were not stacking context needed to have // a PaintLayer for bookkeeping reasons. One such example is the overflow hidden // case that wanted hardware acceleration and thus had to allocate a PaintLayer // to get it. However overflow hidden is something LayoutObject can paint // without a PaintLayer, which includes a lot of painting overhead. Thus the // self-painting flag was introduced. The flag is a band-aid solution done for // performance reason only. It just brush over the underlying problem, which is // that its design doesn't match the system's requirements anymore. // // Note that the self-painting flag determines how we paint a LayoutObject: // - If the flag is true, the LayoutObject is painted through its PaintLayer, // which is required to apply complex paint operations. The paint order is // handled by PaintLayerPainter::paintChildren, where we look at children // PaintLayers. // - If the flag is false, the LayoutObject is painted like normal children (ie // as if it didn't have a PaintLayer). The paint order is handled by // BoxFragmentPainter. // This means that the self-painting flag changes the painting order in a subtle // way, which can potentially have visible consequences. Those bugs are called // painting inversion as we invert the order of painting for 2 elements // (painting one wrongly in front of the other). // See https://crbug.com/370604 for an example. // // // ***** STATUS OF PAINTLAYER ***** // We would like to remove this class in the future. The reasons for the removal // are: // - it has been a dumping ground for features for too long. // - it is the wrong level of abstraction, bearing no correspondence to any CSS // concept. // // Its features need to be migrated to helper objects. This was started with the // introduction of satellite objects: PaintLayer*. Those helper objects then // need to be moved to the appropriate LayoutObject class, probably to a rare // data field to avoid growing all the LayoutObjects. // // A good example of this is PaintLayerScrollableArea, which can only happen // be instanciated for LayoutBoxes. With the current design, it's hard to know // that by reading the code. class CORE_EXPORT PaintLayer : public GarbageCollected<PaintLayer>, public DisplayItemClient { … }; // This scope should be instantiated for each stacking context during hit-test // and paint. In rare cases, a non-stacking-context PaintLayer containing // self-painting descendants sets descendant_needs_check_position_visibility_ // to true on the containing stacking context to let descendants (not across // descendant stacking contexts) check if they need to hide due to the position // visibility hidden flag on that layer. class CheckAncestorPositionVisibilityScope { … }; #if DCHECK_IS_ON() class PaintLayerListMutationDetector { … }; #endif } // namespace blink #if DCHECK_IS_ON() // Outside the blink namespace for ease of invocation from gdb. CORE_EXPORT void ShowLayerTree(const blink::PaintLayer*); CORE_EXPORT void ShowLayerTree(const blink::LayoutObject*); #endif namespace cppgc { // Assign PaintLayer to be allocated on custom LayoutObjectSpace. SpaceTrait<T, std::enable_if_t<std::is_base_of<blink::PaintLayer, T>::value>>; } // namespace cppgc #endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_PAINT_LAYER_H_