Home | History | Annotate | Download | only in compositing
      1 /*
      2  * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
      3  * Copyright (C) 2014 Google Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #ifndef CompositingLayerAssigner_h
     28 #define CompositingLayerAssigner_h
     29 
     30 #include "core/rendering/compositing/RenderLayerCompositor.h"
     31 #include "platform/geometry/IntRect.h"
     32 #include "platform/geometry/LayoutPoint.h"
     33 
     34 namespace blink {
     35 
     36 class RenderLayer;
     37 
     38 class CompositingLayerAssigner {
     39 public:
     40     explicit CompositingLayerAssigner(RenderLayerCompositor*);
     41     ~CompositingLayerAssigner();
     42 
     43     void assign(RenderLayer* updateRoot, Vector<RenderLayer*>& layersNeedingPaintInvalidation);
     44 
     45     bool layersChanged() const { return m_layersChanged; }
     46 
     47     // FIXME: This function should be private. We should remove the one caller
     48     // once we've fixed the compositing chicken/egg issues.
     49     CompositingStateTransitionType computeCompositedLayerUpdate(RenderLayer*);
     50 
     51 private:
     52     struct SquashingState {
     53         SquashingState()
     54             : mostRecentMapping(0)
     55             , hasMostRecentMapping(false)
     56             , haveAssignedBackingsToEntireSquashingLayerSubtree(false)
     57             , nextSquashedLayerIndex(0)
     58             , totalAreaOfSquashedRects(0) { }
     59 
     60         void updateSquashingStateForNewMapping(CompositedLayerMapping*, bool hasNewCompositedLayerMapping);
     61 
     62         // The most recent composited backing that the layer should squash onto if needed.
     63         CompositedLayerMapping* mostRecentMapping;
     64         bool hasMostRecentMapping;
     65 
     66         // Whether all RenderLayers in the stacking subtree rooted at the most recent mapping's
     67         // owning layer have had CompositedLayerMappings assigned. Layers cannot squash into a
     68         // CompositedLayerMapping owned by a stacking ancestor, since this changes paint order.
     69         bool haveAssignedBackingsToEntireSquashingLayerSubtree;
     70 
     71         // Counter that tracks what index the next RenderLayer would be if it gets squashed to the current squashing layer.
     72         size_t nextSquashedLayerIndex;
     73 
     74         // The absolute bounding rect of all the squashed layers.
     75         IntRect boundingRect;
     76 
     77         // This is simply the sum of the areas of the squashed rects. This can be very skewed if the rects overlap,
     78         // but should be close enough to drive a heuristic.
     79         uint64_t totalAreaOfSquashedRects;
     80     };
     81 
     82     void assignLayersToBackingsInternal(RenderLayer*, SquashingState&, Vector<RenderLayer*>& layersNeedingPaintInvalidation);
     83     void assignLayersToBackingsForReflectionLayer(RenderLayer* reflectionLayer, Vector<RenderLayer*>& layersNeedingPaintInvalidation);
     84     CompositingReasons getReasonsPreventingSquashing(const RenderLayer*, const SquashingState&);
     85     bool squashingWouldExceedSparsityTolerance(const RenderLayer* candidate, const SquashingState&);
     86     void updateSquashingAssignment(RenderLayer*, SquashingState&, CompositingStateTransitionType, Vector<RenderLayer*>& layersNeedingPaintInvalidation);
     87     bool needsOwnBacking(const RenderLayer*) const;
     88 
     89     RenderLayerCompositor* m_compositor;
     90     bool m_layerSquashingEnabled;
     91     bool m_layersChanged;
     92 };
     93 
     94 } // namespace blink
     95 
     96 #endif // CompositingLayerAssigner_h
     97