Home | History | Annotate | Download | only in resources
      1 // Copyright 2012 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_RESOURCES_PICTURE_LAYER_TILING_H_
      6 #define CC_RESOURCES_PICTURE_LAYER_TILING_H_
      7 
      8 #include <utility>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/containers/hash_tables.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "cc/base/cc_export.h"
     15 #include "cc/base/region.h"
     16 #include "cc/base/tiling_data.h"
     17 #include "cc/resources/tile.h"
     18 #include "cc/resources/tile_priority.h"
     19 #include "ui/gfx/rect.h"
     20 
     21 namespace cc {
     22 
     23 class PictureLayerTiling;
     24 
     25 class CC_EXPORT PictureLayerTilingClient {
     26  public:
     27   // Create a tile at the given content_rect (in the contents scale of the
     28   // tiling) This might return null if the client cannot create such a tile.
     29   virtual scoped_refptr<Tile> CreateTile(
     30     PictureLayerTiling* tiling,
     31     gfx::Rect content_rect) = 0;
     32   virtual void UpdatePile(Tile* tile) = 0;
     33   virtual gfx::Size CalculateTileSize(
     34     gfx::Size content_bounds) const = 0;
     35   virtual const Region* GetInvalidation() = 0;
     36   virtual const PictureLayerTiling* GetTwinTiling(
     37       const PictureLayerTiling* tiling) const = 0;
     38 
     39  protected:
     40   virtual ~PictureLayerTilingClient() {}
     41 };
     42 
     43 class CC_EXPORT PictureLayerTiling {
     44  public:
     45   ~PictureLayerTiling();
     46 
     47   // Create a tiling with no tiles.  CreateTiles must be called to add some.
     48   static scoped_ptr<PictureLayerTiling> Create(
     49       float contents_scale,
     50       gfx::Size layer_bounds,
     51       PictureLayerTilingClient* client);
     52   gfx::Size layer_bounds() const { return layer_bounds_; }
     53   void SetLayerBounds(gfx::Size layer_bounds);
     54   void Invalidate(const Region& layer_region);
     55   void CreateMissingTilesInLiveTilesRect();
     56 
     57   void SetCanUseLCDText(bool can_use_lcd_text);
     58 
     59   void SetClient(PictureLayerTilingClient* client);
     60   void set_resolution(TileResolution resolution) { resolution_ = resolution; }
     61   TileResolution resolution() const { return resolution_; }
     62 
     63   gfx::Rect ContentRect() const;
     64   gfx::SizeF ContentSizeF() const;
     65   gfx::Rect live_tiles_rect() const { return live_tiles_rect_; }
     66   gfx::Size tile_size() const { return tiling_data_.max_texture_size(); }
     67   float contents_scale() const { return contents_scale_; }
     68 
     69   void CreateAllTilesForTesting() {
     70     SetLiveTilesRect(gfx::Rect(tiling_data_.total_size()));
     71   }
     72 
     73   std::vector<Tile*> AllTilesForTesting() const {
     74     std::vector<Tile*> all_tiles;
     75     for (TileMap::const_iterator it = tiles_.begin();
     76          it != tiles_.end(); ++it)
     77       all_tiles.push_back(it->second.get());
     78     return all_tiles;
     79   }
     80 
     81   Tile* TileAt(int i, int j) const;
     82 
     83   // Iterate over all tiles to fill content_rect.  Even if tiles are invalid
     84   // (i.e. no valid resource) this tiling should still iterate over them.
     85   // The union of all geometry_rect calls for each element iterated over should
     86   // exactly equal content_rect and no two geometry_rects should intersect.
     87   class CC_EXPORT CoverageIterator {
     88    public:
     89     CoverageIterator();
     90     CoverageIterator(const PictureLayerTiling* tiling,
     91         float dest_scale,
     92         gfx::Rect rect);
     93     ~CoverageIterator();
     94 
     95     // Visible rect (no borders), always in the space of content_rect,
     96     // regardless of the contents scale of the tiling.
     97     gfx::Rect geometry_rect() const;
     98     // Texture rect (in texels) for geometry_rect
     99     gfx::RectF texture_rect() const;
    100     gfx::Size texture_size() const;
    101 
    102     // Full rect (including borders) of the current tile, always in the space
    103     // of content_rect, regardless of the contents scale of the tiling.
    104     gfx::Rect full_tile_geometry_rect() const;
    105 
    106     Tile* operator->() const { return current_tile_; }
    107     Tile* operator*() const { return current_tile_; }
    108 
    109     CoverageIterator& operator++();
    110     operator bool() const { return tile_j_ <= bottom_; }
    111 
    112     int i() const { return tile_i_; }
    113     int j() const { return tile_j_; }
    114 
    115    private:
    116     const PictureLayerTiling* tiling_;
    117     gfx::Rect dest_rect_;
    118     float dest_to_content_scale_;
    119 
    120     Tile* current_tile_;
    121     gfx::Rect current_geometry_rect_;
    122     int tile_i_;
    123     int tile_j_;
    124     int left_;
    125     int top_;
    126     int right_;
    127     int bottom_;
    128 
    129     friend class PictureLayerTiling;
    130   };
    131 
    132   Region OpaqueRegionInContentRect(gfx::Rect content_rect) const;
    133 
    134   void Reset();
    135 
    136   void UpdateTilePriorities(
    137       WhichTree tree,
    138       gfx::Size device_viewport,
    139       gfx::Rect viewport_in_layer_space,
    140       gfx::Rect visible_layer_rect,
    141       gfx::Size last_layer_bounds,
    142       gfx::Size current_layer_bounds,
    143       float last_layer_contents_scale,
    144       float current_layer_contents_scale,
    145       const gfx::Transform& last_screen_transform,
    146       const gfx::Transform& current_screen_transform,
    147       double current_frame_time_in_seconds,
    148       size_t max_tiles_for_interest_area);
    149 
    150   // Copies the src_tree priority into the dst_tree priority for all tiles.
    151   // The src_tree priority is reset to the lowest priority possible.  This
    152   // also updates the pile on each tile to be the current client's pile.
    153   void DidBecomeActive();
    154 
    155   // Resets the active priority for all tiles in a tiling, when an active
    156   // tiling is becoming recycled. This may include some tiles which are
    157   // not in the the pending tiling (due to invalidations). This must
    158   // be called before DidBecomeActive, as it resets the active priority
    159   // while DidBecomeActive promotes pending priority on a similar set of tiles.
    160   void DidBecomeRecycled();
    161 
    162   void UpdateTilesToCurrentPile();
    163 
    164   bool NeedsUpdateForFrameAtTime(double frame_time_in_seconds) {
    165     return frame_time_in_seconds != last_impl_frame_time_in_seconds_;
    166   }
    167 
    168   scoped_ptr<base::Value> AsValue() const;
    169   size_t GPUMemoryUsageInBytes() const;
    170 
    171   struct RectExpansionCache {
    172     RectExpansionCache();
    173 
    174     gfx::Rect previous_start;
    175     gfx::Rect previous_bounds;
    176     gfx::Rect previous_result;
    177     int64 previous_target;
    178   };
    179 
    180   static
    181   gfx::Rect ExpandRectEquallyToAreaBoundedBy(
    182       gfx::Rect starting_rect,
    183       int64 target_area,
    184       gfx::Rect bounding_rect,
    185       RectExpansionCache* cache);
    186 
    187   bool has_ever_been_updated() const {
    188     return last_impl_frame_time_in_seconds_ != 0.0;
    189   }
    190 
    191  protected:
    192   typedef std::pair<int, int> TileMapKey;
    193   typedef base::hash_map<TileMapKey, scoped_refptr<Tile> > TileMap;
    194 
    195   PictureLayerTiling(float contents_scale,
    196                      gfx::Size layer_bounds,
    197                      PictureLayerTilingClient* client);
    198   void SetLiveTilesRect(gfx::Rect live_tiles_rect);
    199   void CreateTile(int i, int j, const PictureLayerTiling* twin_tiling);
    200 
    201   // Given properties.
    202   float contents_scale_;
    203   gfx::Size layer_bounds_;
    204   TileResolution resolution_;
    205   PictureLayerTilingClient* client_;
    206 
    207   // Internal data.
    208   TilingData tiling_data_;
    209   TileMap tiles_;  // It is not legal to have a NULL tile in the tiles_ map.
    210   gfx::Rect live_tiles_rect_;
    211 
    212   // State saved for computing velocities based upon finite differences.
    213   double last_impl_frame_time_in_seconds_;
    214 
    215   friend class CoverageIterator;
    216 
    217  private:
    218   DISALLOW_ASSIGN(PictureLayerTiling);
    219 
    220   RectExpansionCache expansion_cache_;
    221 };
    222 
    223 }  // namespace cc
    224 
    225 #endif  // CC_RESOURCES_PICTURE_LAYER_TILING_H_
    226