|  | /* | 
|  | * 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 |