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