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