15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_fullscreen.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_input_event.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/fullscreen.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/graphics_2d.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/image_data.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/input_event.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/cpp/mouse_lock.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/rect.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/size.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _MSC_VER 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allow 'this' in initializer list 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning(disable : 4355) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MouseLockInstance : public pp::Instance, public pp::MouseLock { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MouseLockInstance(PP_Instance instance) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : pp::Instance(instance), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::MouseLock(this), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_locked_(false), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_flush_completion_(false), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_factory_(this), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_(this), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_context_bound_(false), 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) was_fullscreen_(false), 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_scanline_(NULL) {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MouseLockInstance(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the browser when the NaCl module is loaded and all ready to go. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the browser to handle incoming input events. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleInputEvent(const pp::InputEvent& event); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called whenever the in-browser window changes size. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidChangeView(const pp::View& view); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the browser when mouselock is lost. This happens when the NaCl 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // module exits fullscreen mode. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MouseLockLost(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the Cartesian distance between two points. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) double GetDistance(int point_1_x, 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int point_1_y, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int point_2_x, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int point_2_y) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqrt(pow(static_cast<double>(point_1_x - point_2_x), 2) + 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pow(static_cast<double>(point_1_y - point_2_y), 2)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when mouse lock has been acquired. Used as a callback to 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pp::MouseLock.LockMouse(). 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidLockMouse(int32_t result); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the 2D context has been flushed to the browser window. Used 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as a callback to pp::Graphics2D.Flush(). 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidFlush(int32_t result); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a new paint buffer, paints it then flush it to the 2D context. If 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a flush is pending, this does nothing. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Paint(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new pp::ImageData and paint the graphics that represent the mouse 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // movement in it. Return the new pp::ImageData. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::ImageData PaintImage(const pp::Size& size); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Fill the image with the background color. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearToBackground(pp::ImageData* image); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DrawCenterSpot(pp::ImageData* image, uint32_t spot_color); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DrawNeedle(pp::ImageData* image, uint32_t needle_color); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Print the printf-style format to the "console" via PostMessage. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Log(const char* format, ...); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Size size_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mouse_locked_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Point mouse_movement_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_for_flush_completion_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::CompletionCallbackFactory<MouseLockInstance> callback_factory_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Fullscreen fullscreen_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Graphics2D device_context_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_context_bound_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool was_fullscreen_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* background_scanline_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 103