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_
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"
22 struct AppendQuadsData
;
24 class MicroBenchmarkImpl
;
27 class CC_EXPORT PictureLayerImpl
29 NON_EXPORTED_BASE(public PictureLayerTilingClient
) {
31 class CC_EXPORT LayerRasterTileIterator
{
33 LayerRasterTileIterator();
34 LayerRasterTileIterator(PictureLayerImpl
* layer
, bool prioritize_low_res
);
35 ~LayerRasterTileIterator();
38 LayerRasterTileIterator
& operator++();
39 operator bool() const;
42 enum IteratorType
{ LOW_RES
, HIGH_RES
, NUM_ITERATORS
};
44 PictureLayerImpl
* layer_
;
46 struct IterationStage
{
47 IteratorType iterator_type
;
48 TilePriority::PriorityBin tile_type
;
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
{
60 LayerEvictionTileIterator();
61 LayerEvictionTileIterator(PictureLayerImpl
* layer
,
62 TreePriority tree_priority
);
63 ~LayerEvictionTileIterator();
66 LayerEvictionTileIterator
& operator++();
67 operator bool() const;
70 void AdvanceToNextIterator();
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
)
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;
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_
;
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
);
231 #endif // CC_LAYERS_PICTURE_LAYER_IMPL_H_