picture_layer_impl.h revision f2477e01787aa58f445919b809d89e252beef54f
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
20namespace cc {
21
22struct AppendQuadsData;
23class QuadSink;
24class MicroBenchmarkImpl;
25
26class CC_EXPORT PictureLayerImpl
27    : public LayerImpl,
28      NON_EXPORTED_BASE(public PictureLayerTilingClient) {
29 public:
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) 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  void DoPostCommitInitializationIfNeeded() {
95    if (needs_post_commit_initialization_)
96      DoPostCommitInitialization();
97  }
98  void DoPostCommitInitialization();
99
100  bool CanHaveTilings() const;
101  bool CanHaveTilingWithScale(float contents_scale) const;
102  void SanityCheckTilingState() const;
103
104  virtual void GetDebugBorderProperties(
105      SkColor* color, float* width) const OVERRIDE;
106  virtual void AsValueInto(base::DictionaryValue* dict) const OVERRIDE;
107
108  PictureLayerImpl* twin_layer_;
109
110  scoped_ptr<PictureLayerTilingSet> tilings_;
111  scoped_refptr<PicturePileImpl> pile_;
112  Region invalidation_;
113
114  gfx::Transform last_screen_space_transform_;
115  gfx::Size last_bounds_;
116  float last_content_scale_;
117  bool is_mask_;
118
119  float ideal_page_scale_;
120  float ideal_device_scale_;
121  float ideal_source_scale_;
122  float ideal_contents_scale_;
123
124  float raster_page_scale_;
125  float raster_device_scale_;
126  float raster_source_scale_;
127  float raster_contents_scale_;
128  float low_res_raster_contents_scale_;
129
130  bool raster_source_scale_was_animating_;
131  bool is_using_lcd_text_;
132  bool needs_post_commit_initialization_;
133  // A sanity state check to make sure UpdateTilePriorities only gets called
134  // after a CalculateContentsScale/ManageTilings.
135  bool should_update_tile_priorities_;
136
137  friend class PictureLayer;
138  DISALLOW_COPY_AND_ASSIGN(PictureLayerImpl);
139};
140
141}  // namespace cc
142
143#endif  // CC_LAYERS_PICTURE_LAYER_IMPL_H_
144