1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/compiler_specific.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/input/layer_scroll_offset_delegate.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/in_process/synchronous_compositor_output_surface.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/input/input_event_ack_state.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/synchronous_compositor.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ipc/ipc_message.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace cc {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class InputHandler;
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WebInputEvent;
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content {
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class InputHandlerManager;
30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochstruct DidOverscrollParams;
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// The purpose of this class is to act as the intermediary between the various
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// components that make up the 'synchronous compositor mode' implementation and
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// expose their functionality via the SynchronousCompositor interface.
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This class is created on the main thread but most of the APIs are called
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// from the Compositor thread.
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SynchronousCompositorImpl
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public cc::LayerScrollOffsetDelegate,
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public SynchronousCompositor,
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public SynchronousCompositorOutputSurfaceDelegate,
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public WebContentsUserData<SynchronousCompositorImpl> {
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // When used from browser code, use both |process_id| and |routing_id|.
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static SynchronousCompositorImpl* FromID(int process_id, int routing_id);
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // When handling upcalls from renderer code, use this version; the process id
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is implicitly that of the in-process renderer.
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static SynchronousCompositorImpl* FromRoutingID(int routing_id);
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InputEventAckState HandleInputEvent(const blink::WebInputEvent& input_event);
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SynchronousCompositor
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetClient(SynchronousCompositorClient* compositor_client)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      OVERRIDE;
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool InitializeHwDraw() OVERRIDE;
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void ReleaseHwDraw() OVERRIDE;
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual scoped_ptr<cc::CompositorFrame> DemandDrawHw(
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      gfx::Size surface_size,
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Transform& transform,
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      gfx::Rect viewport,
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Rect clip,
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Rect viewport_rect_for_tile_priority,
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::Transform& transform_for_tile_priority) OVERRIDE;
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool DemandDrawSw(SkCanvas* canvas) OVERRIDE;
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void ReturnResources(
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const cc::CompositorFrameAck& frame_ack) OVERRIDE;
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetMemoryPolicy(
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const SynchronousCompositorMemoryPolicy& policy) OVERRIDE;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidChangeRootLayerScrollOffset() OVERRIDE;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SynchronousCompositorOutputSurfaceDelegate
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidBindOutputSurface(
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) OVERRIDE;
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidDestroySynchronousOutputSurface(
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) OVERRIDE;
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetContinuousInvalidate(bool enable) OVERRIDE;
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void DidActivatePendingTree() OVERRIDE;
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // LayerScrollOffsetDelegate
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE;
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void UpdateRootLayerState(const gfx::Vector2dF& total_scroll_offset,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const gfx::Vector2dF& max_scroll_offset,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    const gfx::SizeF& scrollable_size,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    float page_scale_factor,
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    float min_page_scale_factor,
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    float max_page_scale_factor) OVERRIDE;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool IsExternalFlingActive() const OVERRIDE;
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void SetInputHandler(cc::InputHandler* input_handler);
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void DidOverscroll(const DidOverscrollParams& params);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DidStopFlinging();
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit SynchronousCompositorImpl(WebContents* contents);
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~SynchronousCompositorImpl();
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class WebContentsUserData<SynchronousCompositorImpl>;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void UpdateFrameMetaData(const cc::CompositorFrameMetadata& frame_info);
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void DeliverMessages();
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool CalledOnValidThread() const;
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorClient* compositor_client_;
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorOutputSurface* output_surface_;
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents_;
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  cc::InputHandler* input_handler_;
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::WeakPtrFactory<SynchronousCompositorImpl> weak_ptr_factory_;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorImpl);
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_
114