Revert 268405 "Make sure that ScratchBuffer::Allocate() always r..."
[chromium-blink-merge.git] / cc / layers / picture_layer_impl.h
blobb559e3d491af7ae4246907b22d6487759cc388bb
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.
5 #ifndef CC_LAYERS_PICTURE_LAYER_IMPL_H_
6 #define CC_LAYERS_PICTURE_LAYER_IMPL_H_
8 #include <string>
9 #include <vector>
11 #include "cc/base/cc_export.h"
12 #include "cc/base/scoped_ptr_vector.h"
13 #include "cc/layers/layer_impl.h"
14 #include "cc/resources/picture_layer_tiling.h"
15 #include "cc/resources/picture_layer_tiling_set.h"
16 #include "cc/resources/picture_pile_impl.h"
17 #include "skia/ext/refptr.h"
18 #include "third_party/skia/include/core/SkPicture.h"
20 namespace cc {
22 struct AppendQuadsData;
23 class QuadSink;
24 class MicroBenchmarkImpl;
25 class Tile;
27 class CC_EXPORT PictureLayerImpl
28 : public LayerImpl,
29 NON_EXPORTED_BASE(public PictureLayerTilingClient) {
30 public:
31 class CC_EXPORT LayerRasterTileIterator {
32 public:
33 LayerRasterTileIterator();
34 LayerRasterTileIterator(PictureLayerImpl* layer, bool prioritize_low_res);
35 ~LayerRasterTileIterator();
37 Tile* operator*();
38 LayerRasterTileIterator& operator++();
39 operator bool() const;
41 private:
42 enum IteratorType { LOW_RES, HIGH_RES, NUM_ITERATORS };
44 PictureLayerImpl* layer_;
46 struct IterationStage {
47 IteratorType iterator_type;
48 TilePriority::PriorityBin tile_type;
51 int current_stage_;
53 // One low res stage, and three high res stages.
54 IterationStage stages_[4];
55 PictureLayerTiling::TilingRasterTileIterator iterators_[NUM_ITERATORS];
58 class CC_EXPORT LayerEvictionTileIterator {
59 public:
60 LayerEvictionTileIterator();
61 LayerEvictionTileIterator(PictureLayerImpl* layer,
62 TreePriority tree_priority);
63 ~LayerEvictionTileIterator();
65 Tile* operator*();
66 LayerEvictionTileIterator& operator++();
67 operator bool() const;
69 private:
70 void AdvanceToNextIterator();
71 bool IsCorrectType(
72 PictureLayerTiling::TilingEvictionTileIterator* it) const;
74 std::vector<PictureLayerTiling::TilingEvictionTileIterator> iterators_;
75 size_t iterator_index_;
76 TilePriority::PriorityBin iteration_stage_;
77 bool required_for_activation_;
79 PictureLayerImpl* layer_;
82 static scoped_ptr<PictureLayerImpl> Create(LayerTreeImpl* tree_impl, int id) {
83 return make_scoped_ptr(new PictureLayerImpl(tree_impl, id));
85 virtual ~PictureLayerImpl();
87 // LayerImpl overrides.
88 virtual const char* LayerTypeAsString() const OVERRIDE;
89 virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
90 OVERRIDE;
91 virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE;
92 virtual void AppendQuads(QuadSink* quad_sink,
93 AppendQuadsData* append_quads_data) OVERRIDE;
94 virtual void UpdateTilePriorities() OVERRIDE;
95 virtual void NotifyTileInitialized(const Tile* tile) OVERRIDE;
96 virtual void DidBecomeActive() OVERRIDE;
97 virtual void DidBeginTracing() OVERRIDE;
98 virtual void ReleaseResources() OVERRIDE;
99 virtual void CalculateContentsScale(float ideal_contents_scale,
100 float device_scale_factor,
101 float page_scale_factor,
102 float maximum_animation_contents_scale,
103 bool animating_transform_to_screen,
104 float* contents_scale_x,
105 float* contents_scale_y,
106 gfx::Size* content_bounds) OVERRIDE;
107 virtual skia::RefPtr<SkPicture> GetPicture() OVERRIDE;
109 // PictureLayerTilingClient overrides.
110 virtual scoped_refptr<Tile> CreateTile(
111 PictureLayerTiling* tiling,
112 const gfx::Rect& content_rect) OVERRIDE;
113 virtual void UpdatePile(Tile* tile) OVERRIDE;
114 virtual gfx::Size CalculateTileSize(
115 const gfx::Size& content_bounds) const OVERRIDE;
116 virtual const Region* GetInvalidation() OVERRIDE;
117 virtual const PictureLayerTiling* GetTwinTiling(
118 const PictureLayerTiling* tiling) const OVERRIDE;
119 virtual size_t GetMaxTilesForInterestArea() const OVERRIDE;
120 virtual float GetSkewportTargetTimeInSeconds() const OVERRIDE;
121 virtual int GetSkewportExtrapolationLimitInContentPixels() const OVERRIDE;
123 // PushPropertiesTo active tree => pending tree.
124 void SyncTiling(const PictureLayerTiling* tiling);
126 // Mask-related functions
127 void SetIsMask(bool is_mask);
128 virtual ResourceProvider::ResourceId ContentsResourceId() const OVERRIDE;
130 virtual size_t GPUMemoryUsageInBytes() const OVERRIDE;
132 virtual void RunMicroBenchmark(MicroBenchmarkImpl* benchmark) OVERRIDE;
134 void SetUseGpuRasterization(bool use_gpu);
135 bool ShouldUseGpuRasterization() const { return use_gpu_rasterization_; }
137 // Functions used by tile manager.
138 void DidUnregisterLayer();
139 PictureLayerImpl* GetTwinLayer() { return twin_layer_; }
140 WhichTree GetTree() const;
141 bool IsOnActiveOrPendingTree() const;
143 protected:
144 friend class LayerRasterTileIterator;
146 PictureLayerImpl(LayerTreeImpl* tree_impl, int id);
147 PictureLayerTiling* AddTiling(float contents_scale);
148 void RemoveTiling(float contents_scale);
149 void RemoveAllTilings();
150 void SyncFromActiveLayer(const PictureLayerImpl* other);
151 void ManageTilings(bool animating_transform_to_screen,
152 float maximum_animation_contents_scale);
153 bool ShouldHaveLowResTiling() const {
154 return should_use_low_res_tiling_ && !ShouldUseGpuRasterization();
156 virtual bool ShouldAdjustRasterScale(
157 bool animating_transform_to_screen) const;
158 virtual void RecalculateRasterScales(bool animating_transform_to_screen,
159 float maximum_animation_contents_scale);
160 void CleanUpTilingsOnActiveLayer(
161 std::vector<PictureLayerTiling*> used_tilings);
162 float MinimumContentsScale() const;
163 float SnappedContentsScale(float new_contents_scale);
164 void UpdateLCDTextStatus(bool new_status);
165 void ResetRasterScale();
166 void MarkVisibleResourcesAsRequired() const;
167 bool MarkVisibleTilesAsRequired(
168 PictureLayerTiling* tiling,
169 const PictureLayerTiling* optional_twin_tiling,
170 float contents_scale,
171 const gfx::Rect& rect,
172 const Region& missing_region) const;
174 void DoPostCommitInitializationIfNeeded() {
175 if (needs_post_commit_initialization_)
176 DoPostCommitInitialization();
178 void DoPostCommitInitialization();
180 bool CanHaveTilings() const;
181 bool CanHaveTilingWithScale(float contents_scale) const;
182 void SanityCheckTilingState() const;
184 virtual void GetDebugBorderProperties(
185 SkColor* color, float* width) const OVERRIDE;
186 virtual void AsValueInto(base::DictionaryValue* dict) const OVERRIDE;
188 PictureLayerImpl* twin_layer_;
190 scoped_ptr<PictureLayerTilingSet> tilings_;
191 scoped_refptr<PicturePileImpl> pile_;
192 Region invalidation_;
194 bool is_mask_;
196 float ideal_page_scale_;
197 float ideal_device_scale_;
198 float ideal_source_scale_;
199 float ideal_contents_scale_;
201 float raster_page_scale_;
202 float raster_device_scale_;
203 float raster_source_scale_;
204 float raster_contents_scale_;
205 float low_res_raster_contents_scale_;
207 bool raster_source_scale_is_fixed_;
208 bool was_animating_transform_to_screen_;
209 bool is_using_lcd_text_;
210 bool needs_post_commit_initialization_;
211 // A sanity state check to make sure UpdateTilePriorities only gets called
212 // after a CalculateContentsScale/ManageTilings.
213 bool should_update_tile_priorities_;
214 bool should_use_low_res_tiling_;
215 bool use_gpu_rasterization_;
217 bool layer_needs_to_register_itself_;
219 // Save a copy of the visible rect and viewport size of the last frame that
220 // has a valid viewport for prioritizing tiles.
221 gfx::Rect visible_rect_for_tile_priority_;
222 gfx::Size viewport_size_for_tile_priority_;
223 gfx::Transform screen_space_transform_for_tile_priority_;
225 friend class PictureLayer;
226 DISALLOW_COPY_AND_ASSIGN(PictureLayerImpl);
229 } // namespace cc
231 #endif // CC_LAYERS_PICTURE_LAYER_IMPL_H_