1 // Copyright 2013 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_PILE_BASE_H_ 6 #define CC_RESOURCES_PICTURE_PILE_BASE_H_ 7 8 #include <bitset> 9 #include <list> 10 #include <utility> 11 12 #include "base/containers/hash_tables.h" 13 #include "base/memory/ref_counted.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/picture.h" 18 #include "ui/gfx/size.h" 19 20 namespace base { 21 namespace debug { 22 class TracedValue; 23 } 24 class Value; 25 } 26 27 namespace cc { 28 29 class CC_EXPORT PicturePileBase : public base::RefCounted<PicturePileBase> { 30 public: 31 PicturePileBase(); 32 explicit PicturePileBase(const PicturePileBase* other); 33 tiling_size()34 gfx::Size tiling_size() const { return tiling_.tiling_size(); } 35 void SetMinContentsScale(float min_contents_scale); 36 37 // If non-empty, all pictures tiles inside this rect are recorded. There may 38 // be recordings outside this rect, but everything inside the rect is 39 // recorded. recorded_viewport()40 gfx::Rect recorded_viewport() const { return recorded_viewport_; } 41 num_tiles_x()42 int num_tiles_x() const { return tiling_.num_tiles_x(); } num_tiles_y()43 int num_tiles_y() const { return tiling_.num_tiles_y(); } tile_bounds(int x,int y)44 gfx::Rect tile_bounds(int x, int y) const { return tiling_.TileBounds(x, y); } 45 bool HasRecordingAt(int x, int y); 46 bool CanRaster(float contents_scale, const gfx::Rect& content_rect); 47 48 // If this pile contains any valid recordings. May have false positives. HasRecordings()49 bool HasRecordings() const { return has_any_recordings_; } 50 51 // If this pile has ever contained any recordings with text. has_text()52 bool has_text() const { return has_text_; } 53 is_solid_color()54 bool is_solid_color() const { return is_solid_color_; } solid_color()55 SkColor solid_color() const { return solid_color_; } 56 set_is_mask(bool is_mask)57 void set_is_mask(bool is_mask) { is_mask_ = is_mask; } is_mask()58 bool is_mask() const { return is_mask_; } 59 60 static void ComputeTileGridInfo(const gfx::Size& tile_grid_size, 61 SkTileGridFactory::TileGridInfo* info); 62 63 void SetTileGridSize(const gfx::Size& tile_grid_size); tiling()64 TilingData& tiling() { return tiling_; } 65 66 void AsValueInto(base::debug::TracedValue* array) const; 67 68 protected: 69 class CC_EXPORT PictureInfo { 70 public: 71 enum { 72 INVALIDATION_FRAMES_TRACKED = 32 73 }; 74 75 PictureInfo(); 76 ~PictureInfo(); 77 78 bool Invalidate(int frame_number); 79 bool NeedsRecording(int frame_number, int distance_to_visible); 80 void SetPicture(scoped_refptr<Picture> picture); 81 const Picture* GetPicture() const; 82 GetInvalidationFrequencyForTesting()83 float GetInvalidationFrequencyForTesting() const { 84 return GetInvalidationFrequency(); 85 } 86 87 private: 88 void AdvanceInvalidationHistory(int frame_number); 89 float GetInvalidationFrequency() const; 90 91 int last_frame_number_; 92 scoped_refptr<const Picture> picture_; 93 std::bitset<INVALIDATION_FRAMES_TRACKED> invalidation_history_; 94 }; 95 96 typedef std::pair<int, int> PictureMapKey; 97 typedef base::hash_map<PictureMapKey, PictureInfo> PictureMap; 98 99 virtual ~PicturePileBase(); 100 buffer_pixels()101 int buffer_pixels() const { return tiling_.border_texels(); } 102 void Clear(); 103 104 gfx::Rect PaddedRect(const PictureMapKey& key) const; 105 gfx::Rect PadRect(const gfx::Rect& rect) const; 106 107 // An internal CanRaster check that goes to the picture_map rather than 108 // using the recorded_viewport hint. 109 bool CanRasterSlowTileCheck(const gfx::Rect& layer_rect) const; 110 111 // A picture pile is a tiled set of pictures. The picture map is a map of tile 112 // indices to picture infos. 113 PictureMap picture_map_; 114 TilingData tiling_; 115 gfx::Rect recorded_viewport_; 116 float min_contents_scale_; 117 SkTileGridFactory::TileGridInfo tile_grid_info_; 118 SkColor background_color_; 119 int slow_down_raster_scale_factor_for_debug_; 120 bool contents_opaque_; 121 bool contents_fill_bounds_completely_; 122 bool show_debug_picture_borders_; 123 bool clear_canvas_with_debug_color_; 124 // A hint about whether there are any recordings. This may be a false 125 // positive. 126 bool has_any_recordings_; 127 bool has_text_; 128 bool is_mask_; 129 bool is_solid_color_; 130 SkColor solid_color_; 131 132 private: 133 void SetBufferPixels(int buffer_pixels); 134 135 friend class base::RefCounted<PicturePileBase>; 136 DISALLOW_COPY_AND_ASSIGN(PicturePileBase); 137 }; 138 139 } // namespace cc 140 141 #endif // CC_RESOURCES_PICTURE_PILE_BASE_H_ 142