| /* |
| * Copyright (C) 2017 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 _LIBINPUT_DISPLAY_VIEWPORT_H |
| #define _LIBINPUT_DISPLAY_VIEWPORT_H |
| |
| #include <android-base/stringprintf.h> |
| #include <ui/DisplayInfo.h> |
| #include <input/Input.h> |
| #include <inttypes.h> |
| #include <optional> |
| |
| using android::base::StringPrintf; |
| |
| namespace android { |
| |
| /** |
| * Describes the different type of viewports supported by input flinger. |
| * Keep in sync with values in InputManagerService.java. |
| */ |
| enum class ViewportType : int32_t { |
| VIEWPORT_INTERNAL = 1, |
| VIEWPORT_EXTERNAL = 2, |
| VIEWPORT_VIRTUAL = 3, |
| }; |
| |
| static const char* viewportTypeToString(ViewportType type) { |
| switch(type) { |
| case ViewportType::VIEWPORT_INTERNAL: |
| return "INTERNAL"; |
| case ViewportType::VIEWPORT_EXTERNAL: |
| return "EXTERNAL"; |
| case ViewportType::VIEWPORT_VIRTUAL: |
| return "VIRTUAL"; |
| default: |
| return "UNKNOWN"; |
| } |
| } |
| |
| /* |
| * Describes how coordinates are mapped on a physical display. |
| * See com.android.server.display.DisplayViewport. |
| */ |
| struct DisplayViewport { |
| int32_t displayId; // -1 if invalid |
| int32_t orientation; |
| int32_t logicalLeft; |
| int32_t logicalTop; |
| int32_t logicalRight; |
| int32_t logicalBottom; |
| int32_t physicalLeft; |
| int32_t physicalTop; |
| int32_t physicalRight; |
| int32_t physicalBottom; |
| int32_t deviceWidth; |
| int32_t deviceHeight; |
| std::string uniqueId; |
| // The actual (hardware) port that the associated display is connected to. |
| // Not all viewports will have this specified. |
| std::optional<uint8_t> physicalPort; |
| ViewportType type; |
| |
| DisplayViewport() : |
| displayId(ADISPLAY_ID_NONE), orientation(DISPLAY_ORIENTATION_0), |
| logicalLeft(0), logicalTop(0), logicalRight(0), logicalBottom(0), |
| physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0), |
| deviceWidth(0), deviceHeight(0), uniqueId(), physicalPort(std::nullopt), |
| type(ViewportType::VIEWPORT_INTERNAL) { |
| } |
| |
| bool operator==(const DisplayViewport& other) const { |
| return displayId == other.displayId |
| && orientation == other.orientation |
| && logicalLeft == other.logicalLeft |
| && logicalTop == other.logicalTop |
| && logicalRight == other.logicalRight |
| && logicalBottom == other.logicalBottom |
| && physicalLeft == other.physicalLeft |
| && physicalTop == other.physicalTop |
| && physicalRight == other.physicalRight |
| && physicalBottom == other.physicalBottom |
| && deviceWidth == other.deviceWidth |
| && deviceHeight == other.deviceHeight |
| && uniqueId == other.uniqueId |
| && physicalPort == other.physicalPort |
| && type == other.type; |
| } |
| |
| bool operator!=(const DisplayViewport& other) const { |
| return !(*this == other); |
| } |
| |
| inline bool isValid() const { |
| return displayId >= 0; |
| } |
| |
| void setNonDisplayViewport(int32_t width, int32_t height) { |
| displayId = ADISPLAY_ID_NONE; |
| orientation = DISPLAY_ORIENTATION_0; |
| logicalLeft = 0; |
| logicalTop = 0; |
| logicalRight = width; |
| logicalBottom = height; |
| physicalLeft = 0; |
| physicalTop = 0; |
| physicalRight = width; |
| physicalBottom = height; |
| deviceWidth = width; |
| deviceHeight = height; |
| uniqueId.clear(); |
| physicalPort = std::nullopt; |
| type = ViewportType::VIEWPORT_INTERNAL; |
| } |
| |
| std::string toString() const { |
| return StringPrintf("Viewport %s: displayId=%d, uniqueId=%s, port=%s, orientation=%d, " |
| "logicalFrame=[%d, %d, %d, %d], " |
| "physicalFrame=[%d, %d, %d, %d], " |
| "deviceSize=[%d, %d]", |
| viewportTypeToString(type), displayId, |
| uniqueId.c_str(), |
| physicalPort ? StringPrintf("%" PRIu8, *physicalPort).c_str() : "<none>", |
| orientation, |
| logicalLeft, logicalTop, |
| logicalRight, logicalBottom, |
| physicalLeft, physicalTop, |
| physicalRight, physicalBottom, |
| deviceWidth, deviceHeight); |
| } |
| }; |
| |
| } // namespace android |
| |
| #endif // _LIBINPUT_DISPLAY_VIEWPORT_H |