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