Home | History | Annotate | Download | only in trees
      1 // Copyright 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CC_TREES_LAYER_TREE_HOST_COMMON_H_
      6 #define CC_TREES_LAYER_TREE_HOST_COMMON_H_
      7 
      8 #include <limits>
      9 #include <vector>
     10 
     11 #include "base/bind.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "cc/base/cc_export.h"
     14 #include "cc/base/scoped_ptr_vector.h"
     15 #include "cc/layers/layer_lists.h"
     16 #include "ui/gfx/rect.h"
     17 #include "ui/gfx/transform.h"
     18 #include "ui/gfx/vector2d.h"
     19 
     20 namespace cc {
     21 
     22 class LayerImpl;
     23 class Layer;
     24 class SwapPromise;
     25 
     26 class CC_EXPORT LayerTreeHostCommon {
     27  public:
     28   static gfx::Rect CalculateVisibleRect(const gfx::Rect& target_surface_rect,
     29                                         const gfx::Rect& layer_bound_rect,
     30                                         const gfx::Transform& transform);
     31 
     32   template <typename LayerType, typename RenderSurfaceLayerListType>
     33   struct CalcDrawPropsInputs {
     34    public:
     35     CalcDrawPropsInputs(LayerType* root_layer,
     36                         const gfx::Size& device_viewport_size,
     37                         const gfx::Transform& device_transform,
     38                         float device_scale_factor,
     39                         float page_scale_factor,
     40                         const LayerType* page_scale_application_layer,
     41                         int max_texture_size,
     42                         bool can_use_lcd_text,
     43                         bool can_render_to_separate_surface,
     44                         bool can_adjust_raster_scales,
     45                         RenderSurfaceLayerListType* render_surface_layer_list,
     46                         int current_render_surface_layer_list_id)
     47         : root_layer(root_layer),
     48           device_viewport_size(device_viewport_size),
     49           device_transform(device_transform),
     50           device_scale_factor(device_scale_factor),
     51           page_scale_factor(page_scale_factor),
     52           page_scale_application_layer(page_scale_application_layer),
     53           max_texture_size(max_texture_size),
     54           can_use_lcd_text(can_use_lcd_text),
     55           can_render_to_separate_surface(can_render_to_separate_surface),
     56           can_adjust_raster_scales(can_adjust_raster_scales),
     57           render_surface_layer_list(render_surface_layer_list),
     58           current_render_surface_layer_list_id(
     59               current_render_surface_layer_list_id) {}
     60 
     61     LayerType* root_layer;
     62     gfx::Size device_viewport_size;
     63     const gfx::Transform& device_transform;
     64     float device_scale_factor;
     65     float page_scale_factor;
     66     const LayerType* page_scale_application_layer;
     67     int max_texture_size;
     68     bool can_use_lcd_text;
     69     bool can_render_to_separate_surface;
     70     bool can_adjust_raster_scales;
     71     RenderSurfaceLayerListType* render_surface_layer_list;
     72     int current_render_surface_layer_list_id;
     73   };
     74 
     75   template <typename LayerType, typename RenderSurfaceLayerListType>
     76   struct CalcDrawPropsInputsForTesting
     77       : public CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType> {
     78     CalcDrawPropsInputsForTesting(
     79         LayerType* root_layer,
     80         const gfx::Size& device_viewport_size,
     81         const gfx::Transform& device_transform,
     82         RenderSurfaceLayerListType* render_surface_layer_list);
     83     CalcDrawPropsInputsForTesting(
     84         LayerType* root_layer,
     85         const gfx::Size& device_viewport_size,
     86         RenderSurfaceLayerListType* render_surface_layer_list);
     87 
     88    private:
     89     const gfx::Transform identity_transform_;
     90   };
     91 
     92   typedef CalcDrawPropsInputs<Layer, RenderSurfaceLayerList>
     93       CalcDrawPropsMainInputs;
     94   typedef CalcDrawPropsInputsForTesting<Layer, RenderSurfaceLayerList>
     95       CalcDrawPropsMainInputsForTesting;
     96   static void CalculateDrawProperties(CalcDrawPropsMainInputs* inputs);
     97 
     98   typedef CalcDrawPropsInputs<LayerImpl, LayerImplList> CalcDrawPropsImplInputs;
     99   typedef CalcDrawPropsInputsForTesting<LayerImpl, LayerImplList>
    100       CalcDrawPropsImplInputsForTesting;
    101   static void CalculateDrawProperties(CalcDrawPropsImplInputs* inputs);
    102 
    103   template <typename LayerType>
    104   static bool RenderSurfaceContributesToTarget(LayerType*,
    105                                                int target_surface_layer_id);
    106 
    107   template <typename LayerType>
    108   static void CallFunctionForSubtree(
    109       LayerType* root_layer,
    110       const base::Callback<void(LayerType* layer)>& function);
    111 
    112   // Returns a layer with the given id if one exists in the subtree starting
    113   // from the given root layer (including mask and replica layers).
    114   template <typename LayerType>
    115   static LayerType* FindLayerInSubtree(LayerType* root_layer, int layer_id);
    116 
    117   static Layer* get_layer_as_raw_ptr(const LayerList& layers, size_t index) {
    118     return layers[index].get();
    119   }
    120 
    121   static LayerImpl* get_layer_as_raw_ptr(const OwnedLayerImplList& layers,
    122                                          size_t index) {
    123     return layers[index];
    124   }
    125 
    126   static LayerImpl* get_layer_as_raw_ptr(const LayerImplList& layers,
    127                                          size_t index) {
    128     return layers[index];
    129   }
    130 
    131   struct ScrollUpdateInfo {
    132     int layer_id;
    133     gfx::Vector2d scroll_delta;
    134   };
    135 };
    136 
    137 struct CC_EXPORT ScrollAndScaleSet {
    138   ScrollAndScaleSet();
    139   ~ScrollAndScaleSet();
    140 
    141   std::vector<LayerTreeHostCommon::ScrollUpdateInfo> scrolls;
    142   float page_scale_delta;
    143   float top_controls_delta;
    144   ScopedPtrVector<SwapPromise> swap_promises;
    145 };
    146 
    147 template <typename LayerType>
    148 bool LayerTreeHostCommon::RenderSurfaceContributesToTarget(
    149     LayerType* layer,
    150     int target_surface_layer_id) {
    151   // A layer will either contribute its own content, or its render surface's
    152   // content, to the target surface. The layer contributes its surface's content
    153   // when both the following are true:
    154   //  (1) The layer actually has a render surface, and
    155   //  (2) The layer's render surface is not the same as the target surface.
    156   //
    157   // Otherwise, the layer just contributes itself to the target surface.
    158 
    159   return layer->render_surface() && layer->id() != target_surface_layer_id;
    160 }
    161 
    162 template <typename LayerType>
    163 LayerType* LayerTreeHostCommon::FindLayerInSubtree(LayerType* root_layer,
    164                                                    int layer_id) {
    165   if (!root_layer)
    166     return NULL;
    167 
    168   if (root_layer->id() == layer_id)
    169     return root_layer;
    170 
    171   if (root_layer->mask_layer() && root_layer->mask_layer()->id() == layer_id)
    172     return root_layer->mask_layer();
    173 
    174   if (root_layer->replica_layer() &&
    175       root_layer->replica_layer()->id() == layer_id)
    176     return root_layer->replica_layer();
    177 
    178   for (size_t i = 0; i < root_layer->children().size(); ++i) {
    179     if (LayerType* found = FindLayerInSubtree(
    180             get_layer_as_raw_ptr(root_layer->children(), i), layer_id))
    181       return found;
    182   }
    183   return NULL;
    184 }
    185 
    186 template <typename LayerType>
    187 void LayerTreeHostCommon::CallFunctionForSubtree(
    188     LayerType* root_layer,
    189     const base::Callback<void(LayerType* layer)>& function) {
    190   function.Run(root_layer);
    191 
    192   if (LayerType* mask_layer = root_layer->mask_layer())
    193     function.Run(mask_layer);
    194   if (LayerType* replica_layer = root_layer->replica_layer()) {
    195     function.Run(replica_layer);
    196     if (LayerType* mask_layer = replica_layer->mask_layer())
    197       function.Run(mask_layer);
    198   }
    199 
    200   for (size_t i = 0; i < root_layer->children().size(); ++i) {
    201     CallFunctionForSubtree(get_layer_as_raw_ptr(root_layer->children(), i),
    202                            function);
    203   }
    204 }
    205 
    206 template <typename LayerType, typename RenderSurfaceLayerListType>
    207 LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
    208                                                    RenderSurfaceLayerListType>::
    209     CalcDrawPropsInputsForTesting(
    210         LayerType* root_layer,
    211         const gfx::Size& device_viewport_size,
    212         const gfx::Transform& device_transform,
    213         RenderSurfaceLayerListType* render_surface_layer_list)
    214     : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>(
    215           root_layer,
    216           device_viewport_size,
    217           device_transform,
    218           1.f,
    219           1.f,
    220           NULL,
    221           std::numeric_limits<int>::max() / 2,
    222           false,
    223           true,
    224           false,
    225           render_surface_layer_list,
    226           0) {
    227   DCHECK(root_layer);
    228   DCHECK(render_surface_layer_list);
    229 }
    230 
    231 template <typename LayerType, typename RenderSurfaceLayerListType>
    232 LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
    233                                                    RenderSurfaceLayerListType>::
    234     CalcDrawPropsInputsForTesting(
    235         LayerType* root_layer,
    236         const gfx::Size& device_viewport_size,
    237         RenderSurfaceLayerListType* render_surface_layer_list)
    238     : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>(
    239           root_layer,
    240           device_viewport_size,
    241           identity_transform_,
    242           1.f,
    243           1.f,
    244           NULL,
    245           std::numeric_limits<int>::max() / 2,
    246           false,
    247           true,
    248           false,
    249           render_surface_layer_list,
    250           0) {
    251   DCHECK(root_layer);
    252   DCHECK(render_surface_layer_list);
    253 }
    254 
    255 }  // namespace cc
    256 
    257 #endif  // CC_TREES_LAYER_TREE_HOST_COMMON_H_
    258