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)
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/compiler_specific.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/input/layer_scroll_offset_delegate.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/in_process/synchronous_compositor_output_surface.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/port/common/input_event_ack_state.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/synchronous_compositor.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace cc {
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class InputHandler;
199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochstruct DidOverscrollParams;
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class WebInputEvent;
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content {
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class InputHandlerManager;
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// The purpose of this class is to act as the intermediary between the various
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// components that make up the 'synchronous compositor mode' implementation and
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// expose their functionality via the SynchronousCompositor interface.
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This class is created on the main thread but most of the APIs are called
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// from the Compositor thread.
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SynchronousCompositorImpl
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public cc::LayerScrollOffsetDelegate,
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public SynchronousCompositor,
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public SynchronousCompositorOutputSurfaceDelegate,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      public WebContentsUserData<SynchronousCompositorImpl> {
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // When used from browser code, use both |process_id| and |routing_id|.
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static SynchronousCompositorImpl* FromID(int process_id, int routing_id);
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // When handling upcalls from renderer code, use this version; the process id
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is implicitly that of the in-process renderer.
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static SynchronousCompositorImpl* FromRoutingID(int routing_id);
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InputEventAckState HandleInputEvent(const blink::WebInputEvent& input_event);
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SynchronousCompositor
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetClient(SynchronousCompositorClient* compositor_client)
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      OVERRIDE;
51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual bool InitializeHwDraw(
52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      scoped_refptr<gfx::GLSurface> surface) OVERRIDE;
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void ReleaseHwDraw() OVERRIDE;
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool DemandDrawHw(
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      gfx::Size surface_size,
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const gfx::Transform& transform,
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      gfx::Rect viewport,
58fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      gfx::Rect clip,
59fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      bool stencil_enabled) OVERRIDE;
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool DemandDrawSw(SkCanvas* canvas) OVERRIDE;
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetMemoryPolicy(
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const SynchronousCompositorMemoryPolicy& policy) OVERRIDE;
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidChangeRootLayerScrollOffset() OVERRIDE;
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SynchronousCompositorOutputSurfaceDelegate
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidBindOutputSurface(
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) OVERRIDE;
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidDestroySynchronousOutputSurface(
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) OVERRIDE;
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetContinuousInvalidate(bool enable) OVERRIDE;
715e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  virtual void UpdateFrameMetaData(
725e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      const cc::CompositorFrameMetadata& frame_info) OVERRIDE;
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void DidActivatePendingTree() OVERRIDE;
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // LayerScrollOffsetDelegate
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetMaxScrollOffset(gfx::Vector2dF max_scroll_offset) OVERRIDE;
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetTotalScrollOffset(gfx::Vector2dF new_value) OVERRIDE;
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE;
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool IsExternalFlingActive() const OVERRIDE;
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetTotalPageScaleFactor(float page_scale_factor) OVERRIDE;
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetScrollableSize(gfx::SizeF scrollable_size) OVERRIDE;
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void SetInputHandler(cc::InputHandler* input_handler);
849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  void DidOverscroll(const cc::DidOverscrollParams& params);
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit SynchronousCompositorImpl(WebContents* contents);
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~SynchronousCompositorImpl();
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class WebContentsUserData<SynchronousCompositorImpl>;
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DidCreateSynchronousOutputSurface(
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface);
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool CalledOnValidThread() const;
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorClient* compositor_client_;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorOutputSurface* output_surface_;
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents_;
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  cc::InputHandler* input_handler_;
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorImpl);
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_
106