khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 1 | // Copyright 2016 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 UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_ |
| 6 | #define UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_ |
| 7 | |
| 8 | #include "base/macros.h" |
| 9 | #include "base/memory/ref_counted.h" |
| 10 | #include "cc/output/copy_output_request.h" |
| 11 | #include "cc/resources/returned_resource.h" |
| 12 | #include "cc/surfaces/surface_factory.h" |
| 13 | #include "cc/surfaces/surface_factory_client.h" |
| 14 | #include "ui/android/ui_android_export.h" |
| 15 | #include "ui/gfx/selection_bound.h" |
| 16 | |
| 17 | namespace cc { |
| 18 | |
| 19 | class CompositorFrame; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 20 | class Layer; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 21 | class SurfaceManager; |
| 22 | class SurfaceLayer; |
| 23 | class SurfaceIdAllocator; |
| 24 | enum class SurfaceDrawStatus; |
| 25 | |
| 26 | } // namespace cc |
| 27 | |
| 28 | namespace ui { |
| 29 | class ViewAndroid; |
| 30 | class WindowAndroidCompositor; |
| 31 | |
| 32 | class UI_ANDROID_EXPORT DelegatedFrameHostAndroid |
| 33 | : public cc::SurfaceFactoryClient { |
| 34 | public: |
eseckler | 8c15fc3 | 2016-12-20 20:22:20 | [diff] [blame^] | 35 | class Client { |
| 36 | public: |
| 37 | virtual void SetBeginFrameSource( |
| 38 | cc::BeginFrameSource* begin_frame_source) = 0; |
| 39 | virtual void ReturnResources(const cc::ReturnedResourceArray&) = 0; |
| 40 | }; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 41 | |
| 42 | DelegatedFrameHostAndroid(ViewAndroid* view, |
| 43 | SkColor background_color, |
eseckler | 8c15fc3 | 2016-12-20 20:22:20 | [diff] [blame^] | 44 | Client* client); |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 45 | |
| 46 | ~DelegatedFrameHostAndroid() override; |
| 47 | |
| 48 | void SubmitCompositorFrame(cc::CompositorFrame frame, |
| 49 | cc::SurfaceFactory::DrawCallback draw_callback); |
| 50 | |
| 51 | void DestroyDelegatedContent(); |
| 52 | |
| 53 | bool HasDelegatedContent() const; |
| 54 | |
fsamuel | e0f705b | 2016-10-01 14:07:14 | [diff] [blame] | 55 | cc::FrameSinkId GetFrameSinkId() const; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 56 | |
| 57 | // Should only be called when the host has a content layer. |
| 58 | void RequestCopyOfSurface( |
| 59 | WindowAndroidCompositor* compositor, |
| 60 | const gfx::Rect& src_subrect_in_pixel, |
| 61 | cc::CopyOutputRequest::CopyOutputRequestCallback result_callback); |
| 62 | |
danakj | 1120f4c | 2016-09-15 02:05:32 | [diff] [blame] | 63 | void CompositorFrameSinkChanged(); |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 64 | |
| 65 | void UpdateBackgroundColor(SkColor color); |
| 66 | |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 67 | void UpdateContainerSizeinDIP(const gfx::Size& size_in_dip); |
| 68 | |
enne | a487a27 | 2016-09-30 19:56:18 | [diff] [blame] | 69 | // Called when this DFH is attached/detached from a parent browser compositor |
| 70 | // and needs to be attached to the surface hierarchy. |
fsamuel | e0f705b | 2016-10-01 14:07:14 | [diff] [blame] | 71 | void RegisterFrameSinkHierarchy(const cc::FrameSinkId& parent_id); |
| 72 | void UnregisterFrameSinkHierarchy(); |
enne | a487a27 | 2016-09-30 19:56:18 | [diff] [blame] | 73 | |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 74 | private: |
| 75 | // cc::SurfaceFactoryClient implementation. |
| 76 | void ReturnResources(const cc::ReturnedResourceArray& resources) override; |
| 77 | void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) override; |
| 78 | |
| 79 | void UpdateBackgroundLayer(); |
| 80 | |
fsamuel | b6acafa | 2016-10-04 03:21:52 | [diff] [blame] | 81 | const cc::FrameSinkId frame_sink_id_; |
| 82 | |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 83 | ViewAndroid* view_; |
| 84 | |
| 85 | cc::SurfaceManager* surface_manager_; |
| 86 | std::unique_ptr<cc::SurfaceIdAllocator> surface_id_allocator_; |
fsamuel | e0f705b | 2016-10-01 14:07:14 | [diff] [blame] | 87 | cc::FrameSinkId registered_parent_frame_sink_id_; |
eseckler | 8c15fc3 | 2016-12-20 20:22:20 | [diff] [blame^] | 88 | Client* client_; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 89 | |
| 90 | std::unique_ptr<cc::SurfaceFactory> surface_factory_; |
| 91 | |
| 92 | struct FrameData { |
| 93 | FrameData(); |
| 94 | ~FrameData(); |
| 95 | |
fsamuel | 01f3620 | 2016-10-06 01:08:28 | [diff] [blame] | 96 | cc::LocalFrameId local_frame_id; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 97 | gfx::Size surface_size; |
ianwen | e5fc578 | 2016-08-18 04:05:15 | [diff] [blame] | 98 | float top_controls_height; |
| 99 | float top_controls_shown_ratio; |
| 100 | float bottom_controls_height; |
| 101 | float bottom_controls_shown_ratio; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 102 | cc::Selection<gfx::SelectionBound> viewport_selection; |
jbauman | 862bef9 | 2016-09-08 00:32:47 | [diff] [blame] | 103 | bool has_transparent_background; |
khushalsagar | a693aa7 | 2016-08-16 22:18:06 | [diff] [blame] | 104 | }; |
| 105 | std::unique_ptr<FrameData> current_frame_; |
| 106 | |
| 107 | scoped_refptr<cc::SurfaceLayer> content_layer_; |
| 108 | |
| 109 | scoped_refptr<cc::Layer> background_layer_; |
| 110 | |
| 111 | gfx::Size container_size_in_dip_; |
| 112 | |
| 113 | DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid); |
| 114 | }; |
| 115 | |
| 116 | } // namespace ui |
| 117 | |
| 118 | #endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_ |