| /* | 
 |  * Copyright (C) 2019 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #ifndef _UI_INPUTREADER_MULTI_TOUCH_INPUT_MAPPER_H | 
 | #define _UI_INPUTREADER_MULTI_TOUCH_INPUT_MAPPER_H | 
 |  | 
 | #include "TouchInputMapper.h" | 
 |  | 
 | namespace android { | 
 |  | 
 | /* Keeps track of the state of multi-touch protocol. */ | 
 | class MultiTouchMotionAccumulator { | 
 | public: | 
 |     class Slot { | 
 |     public: | 
 |         inline bool isInUse() const { return mInUse; } | 
 |         inline int32_t getX() const { return mAbsMTPositionX; } | 
 |         inline int32_t getY() const { return mAbsMTPositionY; } | 
 |         inline int32_t getTouchMajor() const { return mAbsMTTouchMajor; } | 
 |         inline int32_t getTouchMinor() const { | 
 |             return mHaveAbsMTTouchMinor ? mAbsMTTouchMinor : mAbsMTTouchMajor; | 
 |         } | 
 |         inline int32_t getToolMajor() const { return mAbsMTWidthMajor; } | 
 |         inline int32_t getToolMinor() const { | 
 |             return mHaveAbsMTWidthMinor ? mAbsMTWidthMinor : mAbsMTWidthMajor; | 
 |         } | 
 |         inline int32_t getOrientation() const { return mAbsMTOrientation; } | 
 |         inline int32_t getTrackingId() const { return mAbsMTTrackingId; } | 
 |         inline int32_t getPressure() const { return mAbsMTPressure; } | 
 |         inline int32_t getDistance() const { return mAbsMTDistance; } | 
 |         inline int32_t getToolType() const; | 
 |  | 
 |     private: | 
 |         friend class MultiTouchMotionAccumulator; | 
 |  | 
 |         bool mInUse; | 
 |         bool mHaveAbsMTTouchMinor; | 
 |         bool mHaveAbsMTWidthMinor; | 
 |         bool mHaveAbsMTToolType; | 
 |  | 
 |         int32_t mAbsMTPositionX; | 
 |         int32_t mAbsMTPositionY; | 
 |         int32_t mAbsMTTouchMajor; | 
 |         int32_t mAbsMTTouchMinor; | 
 |         int32_t mAbsMTWidthMajor; | 
 |         int32_t mAbsMTWidthMinor; | 
 |         int32_t mAbsMTOrientation; | 
 |         int32_t mAbsMTTrackingId; | 
 |         int32_t mAbsMTPressure; | 
 |         int32_t mAbsMTDistance; | 
 |         int32_t mAbsMTToolType; | 
 |  | 
 |         Slot(); | 
 |         void clear(); | 
 |     }; | 
 |  | 
 |     MultiTouchMotionAccumulator(); | 
 |     ~MultiTouchMotionAccumulator(); | 
 |  | 
 |     void configure(InputDeviceContext& deviceContext, size_t slotCount, bool usingSlotsProtocol); | 
 |     void reset(InputDeviceContext& deviceContext); | 
 |     void process(const RawEvent* rawEvent); | 
 |     void finishSync(); | 
 |     bool hasStylus() const; | 
 |  | 
 |     inline size_t getSlotCount() const { return mSlotCount; } | 
 |     inline const Slot* getSlot(size_t index) const { return &mSlots[index]; } | 
 |  | 
 | private: | 
 |     int32_t mCurrentSlot; | 
 |     Slot* mSlots; | 
 |     size_t mSlotCount; | 
 |     bool mUsingSlotsProtocol; | 
 |     bool mHaveStylus; | 
 |  | 
 |     void clearSlots(int32_t initialSlot); | 
 | }; | 
 |  | 
 | class MultiTouchInputMapper : public TouchInputMapper { | 
 | public: | 
 |     explicit MultiTouchInputMapper(InputDeviceContext& deviceContext); | 
 |     ~MultiTouchInputMapper() override; | 
 |  | 
 |     void reset(nsecs_t when) override; | 
 |     void process(const RawEvent* rawEvent) override; | 
 |  | 
 | protected: | 
 |     void syncTouch(nsecs_t when, RawState* outState) override; | 
 |     void configureRawPointerAxes() override; | 
 |     bool hasStylus() const override; | 
 |  | 
 | private: | 
 |     // If the slot is in use, return the bit id. Return std::nullopt otherwise. | 
 |     std::optional<int32_t> getActiveBitId(const MultiTouchMotionAccumulator::Slot& inSlot); | 
 |     MultiTouchMotionAccumulator mMultiTouchMotionAccumulator; | 
 |  | 
 |     // Specifies the pointer id bits that are in use, and their associated tracking id. | 
 |     BitSet32 mPointerIdBits; | 
 |     int32_t mPointerTrackingIdMap[MAX_POINTER_ID + 1]; | 
 | }; | 
 |  | 
 | } // namespace android | 
 |  | 
 | #endif // _UI_INPUTREADER_MULTI_TOUCH_INPUT_MAPPER_H |