| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CC_LAYERS_SURFACE_LAYER_IMPL_H_ | 
 | #define CC_LAYERS_SURFACE_LAYER_IMPL_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/macros.h" | 
 | #include "base/memory/ptr_util.h" | 
 | #include "cc/cc_export.h" | 
 | #include "cc/layers/layer_impl.h" | 
 | #include "components/viz/common/quads/surface_draw_quad.h" | 
 | #include "components/viz/common/surfaces/surface_id.h" | 
 | #include "components/viz/common/surfaces/surface_info.h" | 
 | #include "components/viz/common/surfaces/surface_range.h" | 
 |  | 
 | namespace cc { | 
 |  | 
 | // This must match SurfaceLayer::UpdateSubmissionStateCB. | 
 | using UpdateSubmissionStateCB = base::RepeatingCallback<void(bool is_visible)>; | 
 |  | 
 | class CC_EXPORT SurfaceLayerImpl : public LayerImpl { | 
 |  public: | 
 |   static std::unique_ptr<SurfaceLayerImpl> Create( | 
 |       LayerTreeImpl* tree_impl, | 
 |       int id, | 
 |       UpdateSubmissionStateCB update_submission_state_callback) { | 
 |     return base::WrapUnique(new SurfaceLayerImpl( | 
 |         tree_impl, id, std::move(update_submission_state_callback))); | 
 |   } | 
 |  | 
 |   static std::unique_ptr<SurfaceLayerImpl> Create(LayerTreeImpl* tree_impl, | 
 |                                                   int id) { | 
 |     return base::WrapUnique( | 
 |         new SurfaceLayerImpl(tree_impl, id, base::BindRepeating([](bool) {}))); | 
 |   } | 
 |  | 
 |   ~SurfaceLayerImpl() override; | 
 |  | 
 |   void SetRange(const viz::SurfaceRange& surface_range, | 
 |                 base::Optional<uint32_t> deadline_in_frames); | 
 |   const viz::SurfaceRange& range() const { return surface_range_; } | 
 |  | 
 |   base::Optional<uint32_t> deadline_in_frames() const { | 
 |     return deadline_in_frames_; | 
 |   } | 
 |  | 
 |   void SetStretchContentToFillBounds(bool stretch_content); | 
 |   bool stretch_content_to_fill_bounds() const { | 
 |     return stretch_content_to_fill_bounds_; | 
 |   } | 
 |  | 
 |   void SetSurfaceHitTestable(bool surface_hit_testable); | 
 |   bool ShouldGenerateSurfaceHitTestData() const { | 
 |     return surface_hit_testable_ && !has_pointer_events_none_; | 
 |   } | 
 |  | 
 |   void SetHasPointerEventsNone(bool has_pointer_events_none); | 
 |   bool has_pointer_events_none() const { return has_pointer_events_none_; } | 
 |  | 
 |   // LayerImpl overrides. | 
 |   std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; | 
 |   void PushPropertiesTo(LayerImpl* layer) override; | 
 |   bool WillDraw(DrawMode draw_mode, | 
 |                 viz::ClientResourceProvider* resource_provider) override; | 
 |   void AppendQuads(viz::RenderPass* render_pass, | 
 |                    AppendQuadsData* append_quads_data) override; | 
 |   bool is_surface_layer() const override; | 
 |  | 
 |  protected: | 
 |   SurfaceLayerImpl(LayerTreeImpl* tree_impl, int id, UpdateSubmissionStateCB); | 
 |  | 
 |  private: | 
 |   viz::SurfaceDrawQuad* CreateSurfaceDrawQuad( | 
 |       viz::RenderPass* render_pass, | 
 |       const viz::SurfaceRange& surface_range); | 
 |  | 
 |   void GetDebugBorderProperties(SkColor* color, float* width) const override; | 
 |   void AppendRainbowDebugBorder(viz::RenderPass* render_pass); | 
 |   void AsValueInto(base::trace_event::TracedValue* dict) const override; | 
 |   const char* LayerTypeAsString() const override; | 
 |  | 
 |   UpdateSubmissionStateCB update_submission_state_callback_; | 
 |   viz::SurfaceRange surface_range_; | 
 |   base::Optional<uint32_t> deadline_in_frames_; | 
 |  | 
 |   bool stretch_content_to_fill_bounds_ = false; | 
 |   bool surface_hit_testable_ = false; | 
 |   bool has_pointer_events_none_ = false; | 
 |   bool will_draw_ = false; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(SurfaceLayerImpl); | 
 | }; | 
 |  | 
 | }  // namespace cc | 
 |  | 
 | #endif  // CC_LAYERS_SURFACE_LAYER_IMPL_H_ |