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_LAYERS_TILED_LAYER_H_ 6 #define CC_LAYERS_TILED_LAYER_H_ 7 8 #include "cc/base/cc_export.h" 9 #include "cc/layers/contents_scaling_layer.h" 10 #include "cc/resources/layer_tiling_data.h" 11 #include "cc/resources/resource_format.h" 12 13 namespace cc { 14 class LayerUpdater; 15 class PrioritizedResourceManager; 16 class PrioritizedResource; 17 class UpdatableTile; 18 19 class CC_EXPORT TiledLayer : public ContentsScalingLayer { 20 public: 21 enum TilingOption { 22 ALWAYS_TILE, 23 NEVER_TILE, 24 AUTO_TILE, 25 }; 26 27 // Layer implementation. 28 virtual void SetIsMask(bool is_mask) OVERRIDE; 29 virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE; 30 virtual bool DrawsContent() const OVERRIDE; 31 virtual void ReduceMemoryUsage() OVERRIDE; 32 virtual void SetNeedsDisplayRect(const gfx::RectF& dirty_rect) OVERRIDE; 33 virtual void SetLayerTreeHost(LayerTreeHost* layer_tree_host) OVERRIDE; 34 virtual void SetTexturePriorities(const PriorityCalculator& priority_calc) 35 OVERRIDE; 36 virtual Region VisibleContentOpaqueRegion() const OVERRIDE; 37 virtual bool Update(ResourceUpdateQueue* queue, 38 const OcclusionTracker<Layer>* occlusion) OVERRIDE; 39 virtual void OnOutputSurfaceCreated() OVERRIDE; 40 41 protected: 42 TiledLayer(); 43 virtual ~TiledLayer(); 44 45 void UpdateTileSizeAndTilingOption(); 46 void UpdateBounds(); 47 48 // Exposed to subclasses for testing. 49 void SetTileSize(const gfx::Size& size); SetTextureFormat(ResourceFormat texture_format)50 void SetTextureFormat(ResourceFormat texture_format) { 51 texture_format_ = texture_format; 52 } 53 void SetBorderTexelOption(LayerTilingData::BorderTexelOption option); NumPaintedTiles()54 size_t NumPaintedTiles() { return tiler_->tiles().size(); } 55 56 virtual LayerUpdater* Updater() const = 0; 57 virtual void CreateUpdaterIfNeeded() = 0; 58 59 // Set invalidations to be potentially repainted during Update(). 60 void InvalidateContentRect(const gfx::Rect& content_rect); 61 62 // Reset state on tiles that will be used for updating the layer. 63 void ResetUpdateState(); 64 65 // After preparing an update, returns true if more painting is needed. 66 bool NeedsIdlePaint(); 67 gfx::Rect IdlePaintRect(); 68 SkipsDraw()69 bool SkipsDraw() const { return skips_draw_; } 70 71 // Virtual for testing 72 virtual PrioritizedResourceManager* ResourceManager(); TilerForTesting()73 const LayerTilingData* TilerForTesting() const { return tiler_.get(); } 74 const PrioritizedResource* ResourceAtForTesting(int i, int j) const; 75 76 private: 77 virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) 78 OVERRIDE; 79 80 void CreateTilerIfNeeded(); set_tiling_option(TilingOption tiling_option)81 void set_tiling_option(TilingOption tiling_option) { 82 tiling_option_ = tiling_option; 83 } 84 85 bool TileOnlyNeedsPartialUpdate(UpdatableTile* tile); 86 bool TileNeedsBufferedUpdate(UpdatableTile* tile); 87 88 void MarkOcclusionsAndRequestTextures( 89 int left, 90 int top, 91 int right, 92 int bottom, 93 const OcclusionTracker<Layer>* occlusion); 94 95 bool UpdateTiles(int left, 96 int top, 97 int right, 98 int bottom, 99 ResourceUpdateQueue* queue, 100 const OcclusionTracker<Layer>* occlusion, 101 bool* did_paint); 102 bool HaveTexturesForTiles(int left, 103 int top, 104 int right, 105 int bottom, 106 bool ignore_occlusions); 107 void MarkTilesForUpdate(gfx::Rect* update_rect, 108 gfx::Rect* paint_rect, 109 int left, 110 int top, 111 int right, 112 int bottom, 113 bool ignore_occlusions); 114 void UpdateTileTextures(const gfx::Rect& update_rect, 115 const gfx::Rect& paint_rect, 116 int left, 117 int top, 118 int right, 119 int bottom, 120 ResourceUpdateQueue* queue, 121 const OcclusionTracker<Layer>* occlusion); 122 void UpdateScrollPrediction(); 123 124 UpdatableTile* TileAt(int i, int j) const; 125 UpdatableTile* CreateTile(int i, int j); 126 127 bool IsSmallAnimatedLayer() const; 128 129 ResourceFormat texture_format_; 130 bool skips_draw_; 131 bool failed_update_; 132 133 // Used for predictive painting. 134 gfx::Vector2d predicted_scroll_; 135 gfx::Rect predicted_visible_rect_; 136 gfx::Rect previous_visible_rect_; 137 gfx::Size previous_content_bounds_; 138 139 TilingOption tiling_option_; 140 scoped_ptr<LayerTilingData> tiler_; 141 142 DISALLOW_COPY_AND_ASSIGN(TiledLayer); 143 }; 144 145 } // namespace cc 146 147 #endif // CC_LAYERS_TILED_LAYER_H_ 148