1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5  * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "nsWrapperCache.h"
8 
9 #include "mozilla/HoldDropJSObjects.h"
10 #include "mozilla/dom/GamepadPoseBinding.h"
11 #include "mozilla/dom/GamepadPose.h"
12 
13 namespace mozilla {
14 namespace dom {
15 
GamepadPose(nsISupports * aParent,const GamepadPoseState & aState)16 GamepadPose::GamepadPose(nsISupports* aParent, const GamepadPoseState& aState)
17     : Pose(aParent), mPoseState(aState) {
18   mozilla::HoldJSObjects(this);
19 }
20 
GamepadPose(nsISupports * aParent)21 GamepadPose::GamepadPose(nsISupports* aParent) : Pose(aParent) {
22   mozilla::HoldJSObjects(this);
23   mPoseState.Clear();
24 }
25 
~GamepadPose()26 GamepadPose::~GamepadPose() { mozilla::DropJSObjects(this); }
27 
28 /* virtual */
WrapObject(JSContext * aJSContext,JS::Handle<JSObject * > aGivenProto)29 JSObject* GamepadPose::WrapObject(JSContext* aJSContext,
30                                   JS::Handle<JSObject*> aGivenProto) {
31   return GamepadPose_Binding::Wrap(aJSContext, this, aGivenProto);
32 }
33 
HasOrientation() const34 bool GamepadPose::HasOrientation() const {
35   return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation);
36 }
37 
HasPosition() const38 bool GamepadPose::HasPosition() const {
39   return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) ||
40          bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated);
41 }
42 
GetPosition(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)43 void GamepadPose::GetPosition(JSContext* aJSContext,
44                               JS::MutableHandle<JSObject*> aRetval,
45                               ErrorResult& aRv) {
46   const bool valid =
47       mPoseState.isPositionValid &&
48       (bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) ||
49        bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated));
50   SetFloat32Array(aJSContext, this, aRetval, mPosition,
51                   valid ? mPoseState.position : nullptr, 3, aRv);
52 }
53 
GetLinearVelocity(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)54 void GamepadPose::GetLinearVelocity(JSContext* aJSContext,
55                                     JS::MutableHandle<JSObject*> aRetval,
56                                     ErrorResult& aRv) {
57   const bool valid =
58       mPoseState.isPositionValid &&
59       (bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) ||
60        bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated));
61   SetFloat32Array(aJSContext, this, aRetval, mLinearVelocity,
62                   valid ? mPoseState.linearVelocity : nullptr, 3, aRv);
63 }
64 
GetLinearAcceleration(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)65 void GamepadPose::GetLinearAcceleration(JSContext* aJSContext,
66                                         JS::MutableHandle<JSObject*> aRetval,
67                                         ErrorResult& aRv) {
68   const bool valid =
69       mPoseState.isPositionValid &&
70       bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration);
71   SetFloat32Array(aJSContext, this, aRetval, mLinearAcceleration,
72                   valid ? mPoseState.linearAcceleration : nullptr, 3, aRv);
73 }
74 
GetOrientation(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)75 void GamepadPose::GetOrientation(JSContext* aJSContext,
76                                  JS::MutableHandle<JSObject*> aRetval,
77                                  ErrorResult& aRv) {
78   const bool valid =
79       mPoseState.isOrientationValid &&
80       bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation);
81   SetFloat32Array(aJSContext, this, aRetval, mOrientation,
82                   valid ? mPoseState.orientation : nullptr, 4, aRv);
83 }
84 
GetAngularVelocity(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)85 void GamepadPose::GetAngularVelocity(JSContext* aJSContext,
86                                      JS::MutableHandle<JSObject*> aRetval,
87                                      ErrorResult& aRv) {
88   const bool valid =
89       mPoseState.isOrientationValid &&
90       bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation);
91   SetFloat32Array(aJSContext, this, aRetval, mAngularVelocity,
92                   valid ? mPoseState.angularVelocity : nullptr, 3, aRv);
93 }
94 
GetAngularAcceleration(JSContext * aJSContext,JS::MutableHandle<JSObject * > aRetval,ErrorResult & aRv)95 void GamepadPose::GetAngularAcceleration(JSContext* aJSContext,
96                                          JS::MutableHandle<JSObject*> aRetval,
97                                          ErrorResult& aRv) {
98   const bool valid =
99       mPoseState.isOrientationValid &&
100       bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration);
101   SetFloat32Array(aJSContext, this, aRetval, mAngularAcceleration,
102                   valid ? mPoseState.angularAcceleration : nullptr, 3, aRv);
103 }
104 
SetPoseState(const GamepadPoseState & aPose)105 void GamepadPose::SetPoseState(const GamepadPoseState& aPose) {
106   mPoseState = aPose;
107 }
108 
GetPoseState()109 const GamepadPoseState& GamepadPose::GetPoseState() { return mPoseState; }
110 
111 }  // namespace dom
112 }  // namespace mozilla
113