1 // Copyright 2013 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 CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_ 6 #define CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_ 7 8 #include "base/basictypes.h" 9 #include "base/compiler_specific.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "cc/input/layer_scroll_offset_delegate.h" 12 #include "content/browser/android/in_process/synchronous_compositor_output_surface.h" 13 #include "content/port/common/input_event_ack_state.h" 14 #include "content/public/browser/android/synchronous_compositor.h" 15 #include "content/public/browser/web_contents_user_data.h" 16 17 namespace cc { 18 class InputHandler; 19 struct DidOverscrollParams; 20 } 21 22 namespace WebKit { 23 class WebInputEvent; 24 } 25 26 namespace content { 27 class InputHandlerManager; 28 29 // The purpose of this class is to act as the intermediary between the various 30 // components that make up the 'synchronous compositor mode' implementation and 31 // expose their functionality via the SynchronousCompositor interface. 32 // This class is created on the main thread but most of the APIs are called 33 // from the Compositor thread. 34 class SynchronousCompositorImpl 35 : public cc::LayerScrollOffsetDelegate, 36 public SynchronousCompositor, 37 public SynchronousCompositorOutputSurfaceDelegate, 38 public WebContentsUserData<SynchronousCompositorImpl> { 39 public: 40 // When used from browser code, use both |process_id| and |routing_id|. 41 static SynchronousCompositorImpl* FromID(int process_id, int routing_id); 42 // When handling upcalls from renderer code, use this version; the process id 43 // is implicitly that of the in-process renderer. 44 static SynchronousCompositorImpl* FromRoutingID(int routing_id); 45 46 InputEventAckState HandleInputEvent(const WebKit::WebInputEvent& input_event); 47 48 // SynchronousCompositor 49 virtual void SetClient(SynchronousCompositorClient* compositor_client) 50 OVERRIDE; 51 virtual bool InitializeHwDraw( 52 scoped_refptr<gfx::GLSurface> surface) OVERRIDE; 53 virtual void ReleaseHwDraw() OVERRIDE; 54 virtual bool DemandDrawHw( 55 gfx::Size surface_size, 56 const gfx::Transform& transform, 57 gfx::Rect viewport, 58 gfx::Rect clip, 59 bool stencil_enabled) OVERRIDE; 60 virtual bool DemandDrawSw(SkCanvas* canvas) OVERRIDE; 61 virtual void SetMemoryPolicy( 62 const SynchronousCompositorMemoryPolicy& policy) OVERRIDE; 63 virtual void DidChangeRootLayerScrollOffset() OVERRIDE; 64 65 // SynchronousCompositorOutputSurfaceDelegate 66 virtual void DidBindOutputSurface( 67 SynchronousCompositorOutputSurface* output_surface) OVERRIDE; 68 virtual void DidDestroySynchronousOutputSurface( 69 SynchronousCompositorOutputSurface* output_surface) OVERRIDE; 70 virtual void SetContinuousInvalidate(bool enable) OVERRIDE; 71 virtual void UpdateFrameMetaData( 72 const cc::CompositorFrameMetadata& frame_info) OVERRIDE; 73 virtual void DidActivatePendingTree() OVERRIDE; 74 75 // LayerScrollOffsetDelegate 76 virtual void SetMaxScrollOffset(gfx::Vector2dF max_scroll_offset) OVERRIDE; 77 virtual void SetTotalScrollOffset(gfx::Vector2dF new_value) OVERRIDE; 78 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE; 79 virtual bool IsExternalFlingActive() const OVERRIDE; 80 virtual void SetTotalPageScaleFactor(float page_scale_factor) OVERRIDE; 81 virtual void SetScrollableSize(gfx::SizeF scrollable_size) OVERRIDE; 82 83 void SetInputHandler(cc::InputHandler* input_handler); 84 void DidOverscroll(const cc::DidOverscrollParams& params); 85 86 private: 87 explicit SynchronousCompositorImpl(WebContents* contents); 88 virtual ~SynchronousCompositorImpl(); 89 friend class WebContentsUserData<SynchronousCompositorImpl>; 90 91 void DidCreateSynchronousOutputSurface( 92 SynchronousCompositorOutputSurface* output_surface); 93 bool CalledOnValidThread() const; 94 95 SynchronousCompositorClient* compositor_client_; 96 SynchronousCompositorOutputSurface* output_surface_; 97 WebContents* contents_; 98 cc::InputHandler* input_handler_; 99 100 DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorImpl); 101 }; 102 103 } // namespace content 104 105 #endif // CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_IMPL_H_ 106