12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_RESOURCES_PICTURE_PILE_BASE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_RESOURCES_PICTURE_PILE_BASE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <bitset> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <utility> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/region.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/tiling_data.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace base { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace debug { 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TracedValue; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Value; 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT PicturePileBase : public base::RefCounted<PicturePileBase> { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PicturePileBase(); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit PicturePileBase(const PicturePileBase* other); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Size tiling_size() const { return tiling_.tiling_size(); } 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetMinContentsScale(float min_contents_scale); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // If non-empty, all pictures tiles inside this rect are recorded. There may 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // be recordings outside this rect, but everything inside the rect is 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // recorded. 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gfx::Rect recorded_viewport() const { return recorded_viewport_; } 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tiles_x() const { return tiling_.num_tiles_x(); } 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tiles_y() const { return tiling_.num_tiles_y(); } 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect tile_bounds(int x, int y) const { return tiling_.TileBounds(x, y); } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasRecordingAt(int x, int y); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool CanRaster(float contents_scale, const gfx::Rect& content_rect); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // If this pile contains any valid recordings. May have false positives. 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool HasRecordings() const { return has_any_recordings_; } 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // If this pile has ever contained any recordings with text. 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool has_text() const { return has_text_; } 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_solid_color() const { return is_solid_color_; } 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkColor solid_color() const { return solid_color_; } 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_is_mask(bool is_mask) { is_mask_ = is_mask; } 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_mask() const { return is_mask_; } 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void ComputeTileGridInfo(const gfx::Size& tile_grid_size, 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SkTileGridFactory::TileGridInfo* info); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetTileGridSize(const gfx::Size& tile_grid_size); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TilingData& tiling() { return tiling_; } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AsValueInto(base::debug::TracedValue* array) const; 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class CC_EXPORT PictureInfo { 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum { 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) INVALIDATION_FRAMES_TRACKED = 32 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PictureInfo(); 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ~PictureInfo(); 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool Invalidate(int frame_number); 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool NeedsRecording(int frame_number, int distance_to_visible); 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetPicture(scoped_refptr<Picture> picture); 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Picture* GetPicture() const; 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float GetInvalidationFrequencyForTesting() const { 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetInvalidationFrequency(); 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void AdvanceInvalidationHistory(int frame_number); 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float GetInvalidationFrequency() const; 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int last_frame_number_; 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<const Picture> picture_; 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::bitset<INVALIDATION_FRAMES_TRACKED> invalidation_history_; 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef std::pair<int, int> PictureMapKey; 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef base::hash_map<PictureMapKey, PictureInfo> PictureMap; 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PicturePileBase(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int buffer_pixels() const { return tiling_.border_texels(); } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Clear(); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Rect PaddedRect(const PictureMapKey& key) const; 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Rect PadRect(const gfx::Rect& rect) const; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // An internal CanRaster check that goes to the picture_map rather than 10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // using the recorded_viewport hint. 10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool CanRasterSlowTileCheck(const gfx::Rect& layer_rect) const; 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // A picture pile is a tiled set of pictures. The picture map is a map of tile 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // indices to picture infos. 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PictureMap picture_map_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TilingData tiling_; 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) gfx::Rect recorded_viewport_; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float min_contents_scale_; 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SkTileGridFactory::TileGridInfo tile_grid_info_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor background_color_; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int slow_down_raster_scale_factor_for_debug_; 1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool contents_opaque_; 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool contents_fill_bounds_completely_; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool show_debug_picture_borders_; 1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool clear_canvas_with_debug_color_; 12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // A hint about whether there are any recordings. This may be a false 12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // positive. 12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool has_any_recordings_; 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool has_text_; 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_mask_; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_solid_color_; 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkColor solid_color_; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetBufferPixels(int buffer_pixels); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<PicturePileBase>; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PicturePileBase); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_PICTURE_PILE_BASE_H_ 142