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