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