• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #ifndef CC_LAYERS_PICTURE_LAYER_IMPL_H_
6 #define CC_LAYERS_PICTURE_LAYER_IMPL_H_
7 
8 #include <string>
9 #include <vector>
10 
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"
19 
20 namespace cc {
21 
22 struct AppendQuadsData;
23 class QuadSink;
24 class MicroBenchmarkImpl;
25 
26 class CC_EXPORT PictureLayerImpl
27     : public LayerImpl,
28       NON_EXPORTED_BASE(public PictureLayerTilingClient) {
29  public:
Create(LayerTreeImpl * tree_impl,int id)30   static scoped_ptr<PictureLayerImpl> Create(LayerTreeImpl* tree_impl, int id) {
31     return make_scoped_ptr(new PictureLayerImpl(tree_impl, id));
32   }
33   virtual ~PictureLayerImpl();
34 
35   // LayerImpl overrides.
36   virtual const char* LayerTypeAsString() const OVERRIDE;
37   virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
38       OVERRIDE;
39   virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE;
40   virtual void AppendQuads(QuadSink* quad_sink,
41                            AppendQuadsData* append_quads_data) OVERRIDE;
42   virtual void UpdateTilePriorities() OVERRIDE;
43   virtual void DidBecomeActive() OVERRIDE;
44   virtual void DidBeginTracing() OVERRIDE;
45   virtual void DidLoseOutputSurface() OVERRIDE;
46   virtual void CalculateContentsScale(float ideal_contents_scale,
47                                       float device_scale_factor,
48                                       float page_scale_factor,
49                                       bool animating_transform_to_screen,
50                                       float* contents_scale_x,
51                                       float* contents_scale_y,
52                                       gfx::Size* content_bounds) OVERRIDE;
53   virtual skia::RefPtr<SkPicture> GetPicture() OVERRIDE;
54 
55   // PictureLayerTilingClient overrides.
56   virtual scoped_refptr<Tile> CreateTile(PictureLayerTiling* tiling,
57                                          gfx::Rect content_rect) OVERRIDE;
58   virtual void UpdatePile(Tile* tile) OVERRIDE;
59   virtual gfx::Size CalculateTileSize(
60       gfx::Size content_bounds) const OVERRIDE;
61   virtual const Region* GetInvalidation() OVERRIDE;
62   virtual const PictureLayerTiling* GetTwinTiling(
63       const PictureLayerTiling* tiling) const OVERRIDE;
64 
65   // PushPropertiesTo active tree => pending tree.
66   void SyncTiling(const PictureLayerTiling* tiling);
67 
68   // Mask-related functions
69   void SetIsMask(bool is_mask);
70   virtual ResourceProvider::ResourceId ContentsResourceId() const OVERRIDE;
71 
72   virtual size_t GPUMemoryUsageInBytes() const OVERRIDE;
73 
74   virtual void RunMicroBenchmark(MicroBenchmarkImpl* benchmark) OVERRIDE;
75 
76  protected:
77   PictureLayerImpl(LayerTreeImpl* tree_impl, int id);
78   PictureLayerTiling* AddTiling(float contents_scale);
79   void RemoveTiling(float contents_scale);
80   void RemoveAllTilings();
81   void SyncFromActiveLayer(const PictureLayerImpl* other);
82   void ManageTilings(bool animating_transform_to_screen);
83   virtual bool ShouldAdjustRasterScale(
84       bool animating_transform_to_screen) const;
85   virtual void RecalculateRasterScales(
86       bool animating_transform_to_screen);
87   void CleanUpTilingsOnActiveLayer(
88       std::vector<PictureLayerTiling*> used_tilings);
89   float MinimumContentsScale() const;
90   float SnappedContentsScale(float new_contents_scale);
91   void UpdateLCDTextStatus(bool new_status);
92   void ResetRasterScale();
93   void MarkVisibleResourcesAsRequired() const;
94   bool MarkVisibleTilesAsRequired(
95       PictureLayerTiling* tiling,
96       const PictureLayerTiling* optional_twin_tiling,
97       float contents_scale,
98       gfx::Rect rect,
99       const Region& missing_region) const;
100 
DoPostCommitInitializationIfNeeded()101   void DoPostCommitInitializationIfNeeded() {
102     if (needs_post_commit_initialization_)
103       DoPostCommitInitialization();
104   }
105   void DoPostCommitInitialization();
106 
107   bool CanHaveTilings() const;
108   bool CanHaveTilingWithScale(float contents_scale) const;
109   void SanityCheckTilingState() const;
110   bool ShouldUseGPURasterization() const;
111 
112   virtual void GetDebugBorderProperties(
113       SkColor* color, float* width) const OVERRIDE;
114   virtual void AsValueInto(base::DictionaryValue* dict) const OVERRIDE;
115 
116   PictureLayerImpl* twin_layer_;
117 
118   scoped_ptr<PictureLayerTilingSet> tilings_;
119   scoped_refptr<PicturePileImpl> pile_;
120   Region invalidation_;
121 
122   gfx::Transform last_screen_space_transform_;
123   gfx::Size last_bounds_;
124   float last_content_scale_;
125   bool is_mask_;
126 
127   float ideal_page_scale_;
128   float ideal_device_scale_;
129   float ideal_source_scale_;
130   float ideal_contents_scale_;
131 
132   float raster_page_scale_;
133   float raster_device_scale_;
134   float raster_source_scale_;
135   float raster_contents_scale_;
136   float low_res_raster_contents_scale_;
137 
138   bool raster_source_scale_was_animating_;
139   bool is_using_lcd_text_;
140   bool needs_post_commit_initialization_;
141   // A sanity state check to make sure UpdateTilePriorities only gets called
142   // after a CalculateContentsScale/ManageTilings.
143   bool should_update_tile_priorities_;
144 
145   friend class PictureLayer;
146   DISALLOW_COPY_AND_ASSIGN(PictureLayerImpl);
147 };
148 
149 }  // namespace cc
150 
151 #endif  // CC_LAYERS_PICTURE_LAYER_IMPL_H_
152